当前,我编写了一个简单的记录器来记录来自bash脚本的消息。记录器工作正常,我只需在日志文件中写上日期和消息即可。由于日志文件将增加,因此我想将记录器的限制设置为例如1000行。达到1000行后,它不会删除或完全清除日志文件。它应该截断第一行并将其替换为新的日志行。因此该文件保留1000行,并且不会进一步增加。最新行应始终位于文件顶部。有内置方法吗?或者我该如何解决?
答案 0 :(得分:1)
您选择的示例可能不是最好的。正如评论所指出的那样,logrotate
是使日志文件大小保持最佳状态的最佳工具。此外,行并不是衡量尺寸的最佳单位。这些评论者都是正确的。
但是,我以您的面值回答您的问题。
您可以通过shell内置函数实现所需的功能,但是使用sed
之类的外部工具会更快,更简单。 (awk
是另一种选择,但是它缺少-i
开关,在这种情况下可以简化您的生活。)
因此,假设您的文件已经存在,然后命名为script.log
maxlines=1000
log_msg='Whatever the log message is'
sed -i -e1i"\\$log_msg" -e$((maxlines))',$d' script.log
做你想要的。
-i
表示在适当位置修改给定文件。 -e1i"\\$log_msg"
表示在第一行( 1 )之前的 i nsert $log_msg
。 -e$((maxlines))',$d'
表示 d 将每一行从行号删除 $((maxlines))
到最后一行( $ )。 答案 1 :(得分:1)
为什么要用新消息替换第一行,从而导致日志文件中消息的顺序跳转,而不是仅仅删除第一行并附加新消息,例如简单地说:
log() {
tail -999 logfile > tmp &&
{ cat tmp && printf '%s\n' "$*"; } > logfile
}
log "new message"
如果您的日志文件始终是小行,则甚至不需要tmp文件,只需将tail的输出保存在变量中,然后将其打印出来即可。
请注意,与sed -i
解决方案不同,以上内容不会更改logfile
的inode,硬链接,权限或其他任何内容-它与您刚开始使用的内容相同,只是更新了内容被替换为新文件。