我有一个程序,它接受一个参数来允许对我们使用的硬件进行额外的调试。
日志只是写入标准输出,所以通常我们只是将标准输出传输到文件,即 ./myprog -AddDebug > myfile.txt,但是我们现在需要保持此日志记录启用以查找故障,我们通常不会这样做,因此正在寻找一种方法来轮换日志以确保服务器的磁盘空间不会被用完。
我通过向 /etc/logrotate.d/mytrace 添加一个配置文件来使用 Linux 中的内置 logrotate 功能,该文件包含以下内容:
/home/myprog/mytrace.txt
{
rotate 5
size 2M
copytruncate
olddir trace_archive
}
当我运行 /usr/sbin/logrotate /etc/logrotate.conf 时,跟踪文件被移动到 archvie,但是,原始文件被重新创建,但显然管道丢失了,因此文件不再被写入。然后我尝试用 替换,create
文件copytruncate
仍然放在存档中,但原始文件却不断增长。
第二个问题是,仅当我手动运行 logrotate 函数时才会存档文件,当达到文件大小时它不会自动触发。
如果您能针对这两个问题提供任何帮助,我们将不胜感激。
更新
我已经设法使其部分工作,为了使 copytruncate 工作,文件需要以追加模式打开,因此应该将其./myprog -AddDebug > myfile.txt
更改为./myprog -AddDebug >> myfile.txt
。
我现在唯一的问题是,只有在我跑步时它才会旋转logrotate -v /etc/logrotate.conf
,那么我该如何让它自动完成呢?
看起来我必须手动创建一个每隔几分钟运行一次的 cronjob 来确保日志被轮换,它不会自动处理。
谢谢
答案1
或者简单地使用适当的标志通过管道| logger
并使用 syslog 来管理您的日志文件。
另外,apache httpd 发行版中包含一个不错的辅助程序rotatelogs
,它接受 stdin 并将为您写入和轮换日志文件,例如,将您的输出通过管道传输到| /usr/sbin/rotatelogs /home/myprog/myproglog.%Y-%m-%d-%H_%M_%S 2M
并创建具有唯一连续文件名的 2 MB 日志文件。
答案2
感谢大家的帮助。
我使用了操作系统内置的标准日志轮换,并将 cronjob 设置为每 5 分钟运行一次,这似乎按照我想要的方式工作。
谢谢