我试图找到一种简单的方法来附加/写入日志,同时将日志修剪到合理的大小。我宁愿不只是永远追加文件,然后必须有一个清理日志脚本。我无法在不使用第二个文件作为临时文件的情况下如何优雅地完成这项工作。
我看过的东西供参考:
我已经阅读了高级脚本指南 http://tldp.org/LDP/abs/html/io-redirection.html
两个命令的组合输出: Bash - 如何将两个命令输出到文件?
理想情况下,我会有类似的东西(我知道这行不通)
(tail-n 1000 foo.log; ./foo.sh) > foo.log
Run Code Online (Sandbox Code Playgroud)
这将保留我正在进行的日志中的最后 1000 行,然后为当前运行的 foo.sh 附加我的新输出。
我想不出一种方法来使用附加重定向 >> 并限制原始文件,而不会将对 foo.sh 的调用包装在其他一些 bar.sh 中
tail -n 1000 foo.log > tmp.log
mv tmp.log foo.log
./foo.sh >> foo.log
Run Code Online (Sandbox Code Playgroud)
这看起来很笨拙。
也许我的答案是让 foo.sh 不依赖 STDOUT 作为发送日志消息的地方,而是直接打开文件。
跟进编辑:
普遍的意见是不建议这样做。我很欣赏的一个意见。但是,正在运行的服务器不在我的控制范围内,并且不会真正处于.... 警惕的管理员之下。它是一个盒子,许多不同的团体拥有盒子的一部分,但没有人负责盒子的整体健康状况。我可以让日志永远构建,并且在完整的时间里它可能无关紧要,但我想尽我所能来统治它,因为我知道最终的管理员不会做任何事情。因此,使用 crontab 运行 logrotate 对我来说是不合适的。我只是在寻找我可以用单个命令的有限点做的事情。
如果您的版本sed有--in-place开关,您可以使用它。它仍然执行“ cpand” mv,但它在幕后,因此脚本看起来不会那么混乱,具体取决于您对sed语法的感受。否则你的tail(你在编辑中错过了一个)和附加方法是我处理它的方式。
另一种方法sed是将日志倒置,将最新条目放在开头。
sed -ni '1s/^/New Entry\n/;100q;p' logfile
Run Code Online (Sandbox Code Playgroud)
这就是它的全部内容(除了让“新条目”成为您想要的)。这将按时间倒序保留滚动的 100 行日志文件。优点是您不必知道文件中有多少行(tail为您处理这个问题,但sed不会)。这在某种程度上假设您的日志条目由一行组成。如果您正在记录脚本的大量输出,我认为您应该返回tail并追加。
对于详细的多行输出来说,另一个可能有效的选择是让文件系统为您完成工作。每个日志条目都是一个单独的文件。
#!/bin/bash
# *** UNTESTED ***
logdir="/path/to/your/log/dir"
# run the script and log its output to a file named with the date and time
script > "$logdir/$(date "+%Y%m%dT%H%M%S").log"
# maintain the logs
# keep the last 100 days of daily logfiles
# (you could keep the last 100 hours of hourly logfiles, for example,
# by using -mmin and doing some math)
# the count is intended to keep old entries from being deleted
# leaving you with nothing if there are no new entries
count=$(find "$logdir" -maxdepth 1 -type f | wc -l)
if (( count > 100 ))
then
find "$logdir" -maxdepth 1 -type f -mtime +100 -delete
fi
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5406 次 |
| 最近记录: |