例子:

例子:

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可以给您。而且您根本不必接触服务器即可让日志编写器切换到新的输出文件。

此类工具包括:

进一步阅读

相关内容