production.log
[2019-02-11 10:18:18] GET /
[2019-02-11 11:18:19] POST blavadasdasdgd
...
... <--- A lot of in between logs and other data
...
[2019-02-12 11:18:20] INFO ::HTTPServer#start: pid=21378 port=4567
[12/Mar/2019:11:18:25 +0200] "GET / HTTP/1.1" 404 458 0.0086
[12/Mar/2019:11:18:26 EET] "GET / HTTP/1.1" 404 458 - -> /
[12/Mar/2019:11:18:27 +0200] "GET /" 200 18893 0.0020
[2019-03-12 11:18:28] GET /
[2019-03-12 12:18:29] POST blablabla
...
... <--- A lot of in between logs and other data
...
[13/Mar/2019:11:18:30 +0200] "GET / HTTP/1.1" 404 458 0.0086
[13/Mar/2019:11:18:31 EET] "GET / HTTP/1.1" 404 458 - -> /
[13/Mar/2019:11:18:32 +0200] "GET /" 200 18893 0.0020
...
... <--- A lot of in between logs and other data
...
[2019-03-14 11:19:18] GET /
该文件的内容是假的(但时间戳的顺序是正确的较老的到较新的)
我有一个通过 nohup 运行的网络服务器,并将所有内容输出到一个名为production.log
正在向其中写入大约(+10GB)的数据和信息,我想以某种方式截断它,以在其中保留大量最近的日志和数据,但要删除旧数据。所以我大致猜测尾部最后 30,000 行将它们输出到一个名为的新文件中production.log.1
然后将其移回并替换为production.log
例子:
tail -30000 production.log > production.log.1 && mv production.log.1 production.log
现在当我尝试tail -f production.log
它时它不会输出任何内容新的来自网络服务器,但它只显示我设法替换文件之前的最后一个时间戳日志。网络服务器只是停止写入。
有没有更好或更好的方法来做到这一点而不写入不同的文件?我需要删除该站点的旧数据,同时保持 2>&1 从网络服务器输出到该站点。
答案1
确保附加文件的输出,即 use>>
和 not >
。
接下来您可以使用“复制并截断”来保留日志:
cp production.log production.log.1 && cp /dev/null production.log
复制命令完成并执行日志文件截断有一个很小的时间窗口,因此您可能会丢失一些日志,但这无法避免。
请注意,该实用程序logrotate
有一个特殊指令来执行此操作:copytruncate
。
使用追加而不是简单地重定向的要点是,否则写入日志文件的程序可能会记住其写入偏移量,因此,如果日志文件的大小例如为 2MB,并且您截断该文件,并且程序再次写入,则您可能会结束创建一个包含 2MB 空块的稀疏日志文件,然后再次记录日志。
答案2
确保它记录到标准错误,或者至少是标准输出,并将其标准输出/错误作为管道的写入端,在管道的读取端运行一个工具,该工具维护严格的大小上限、自动旋转、可旋转-on-demand,日志文件设置在指定的目录中:
./要记录的内容 2>&1 |自行车日志/
您不会有丢失的日志条目logrotate
可以给您。而且您根本不必接触服务器即可让日志编写器切换到新的输出文件。
此类工具包括:
- 丹·伯恩斯坦的
multilog
从守护进程工具,或丹·伯恩斯坦的multilog
从DJBwares,或布鲁斯·冈特的multilog
从daemontools-encore,或者 Adam Sampsonmultilog
的弗里特 - 洛朗·贝尔科特
s6-log
从s6 - 格里特·佩普的
svlogd
从运行 - 韦恩·马歇尔的
tinylog
从罪犯 - 我的
cyclog
从开胃菜
进一步阅读
- 乔纳森·德博因·波拉德 (2016)。在本世纪不要使用 logrotate 或 newsyslog。。经常给出的答案。
- 乔纳森·德博因·波拉德 (2016)。 ”记录”。 小吃指南。软件。
- 乔纳森·德博因·波拉德 (2015)。 ”记录”。守护进程工具家族。经常给出的答案。
- https://unix.stackexchange.com/a/326166/5132