如何使用 >> 限制日志文件大小

dav*_*vid 29 size io-redirection limit

如何将写入的日志文件的大小限制>>为 200MB?

$ run_program >> myprogram.log
Run Code Online (Sandbox Code Playgroud)

Cal*_*leb 12

如果您的程序不需要写入任何大于此限制的其他文件,您可以使用ulimit. 在运行命令之前,运行此命令为当前 shell 会话中运行的所有进程设置 200MB 的文件大小限制:

ulimit -f $((200*1024))
Run Code Online (Sandbox Code Playgroud)

这将保护您的系统,但它可能会对写入文件的程序造成冲击。正如eyazici 建议的那样,考虑设置在logrotate达到特定大小或年龄后修剪日志文件。您可以丢弃旧数据或将其存档在一系列压缩文件中一段时间​​。


Emr*_*ici 12

如果您的应用程序(即run_program)不支持限制日志文件的大小,那么您可以使用外部应用程序或脚本循环定期检查文件大小。

您还可以使用logrotate(8)轮换日志,它具有size可用于您的目的的参数:

这样,当达到指定的大小时,日志文件会旋转。可以以字节(默认)、千字节 (sizek) 或兆字节 (sizem) 为单位指定大小。


tux*_*xce 6

您可以使用以下命令截断输出head

size=$((200*1024*1024-$(stat -c %s myprogram.log)))
run_program | head -c ${size} >> myprogram.log
Run Code Online (Sandbox Code Playgroud)

  • 请注意,一旦达到大小限制,这很可能会终止程序(使用`SIGPIPE`),而不是丢弃数据。 (2认同)

ale*_*lex 6

您可以创建一个新的文件系统映像,使用循环设备挂载它并将日志文件放在该文件系统上:

dd if=/dev/zero of=./200mb.img bs=1024 count=200000 # create new empty 200MB file
mkfs.ext2 200mb.img # or ext3, or whatever fits your needs
mkdir logs
sudo mount -t ext2 -o loop 200mb.img logs # only root can do '-o loop' by default
run_program >>logs/myprogram.log
Run Code Online (Sandbox Code Playgroud)

tmpfs如果您有足够的内存,您也可以使用代替文件。


小智 6

我确信原始海报已经找到了解决方案。这是其他可能阅读此主题的人的另一篇文章......

Curtail 限制程序输出的大小并使用以下命令保留最后 200MB 的输出:

$ run_program | curtail -s 200M myprogram.log
Run Code Online (Sandbox Code Playgroud)

参考

注意:我是上述存储库的维护者。只是分享解决方案...


PRI*_*LOP 5

在包apache2-utils中存在名为 的实用程序rotatelogs,它可能对您有所帮助。

概要:

rotatelogs [ -l ] [ -L linkname ] [ -p program ] [ -f ] [ -t ] [ -v ] [ -e ] [ -c ] [ -n number-of-files ] logfile rotationtime|filesize(B|K|M|G) [ offset ]

Example:

your_program | rotatelogs -n 5 /var/log/logfile 1M
Run Code Online (Sandbox Code Playgroud)

Full manual you may read on this link.