将输出附加到文件,同时将其截断为N行

我试图find一个简单的方法来追加/写入日志,同时保持日志修剪到一个合理的大小。 我宁愿不只是永远追加文件,然后必须有一个清理日志脚本。 我不能把自己的头脑包裹起来,怎样才能完美地完成这个任务,而不需要使用第二个文件作为临时的持有者。

我已经看过的参考资料:

我已经阅读了高级脚本指南http://tldp.org/LDP/abs/html/io-redirection.html

两个命令组合输出: Bash – 如何输出两个命令来存档?

理想情况下,我会有这样的事情(我知道这是行不通的)

(tail-n 1000 foo.log; ./foo.sh) > foo.log 

这将保持从我的日志中的最后1000行,然后附加我的新输出foo.sh当前运行。

我想不出一种方式来使用追加redirect>>和限制原始文件没有包裹调用foo.sh在其他bar.sh

 tail -n 1000 foo.log > tmp.log mv tmp.log foo.log ./foo.sh >> foo.log 

这似乎kludgey。

也许我的答案是让foo.sh不依赖于STDOUT作为发送日志消息的地方,而是直接打开文件。

后续编辑:

普遍的观点是这不被推荐。 我赞赏的意见。 但是,这个服务器是在我的控制之外,而不是真的在一个….警惕的pipe理员。 它是一个箱子,许多不同的小组拥有箱子的一部分,但没有人对箱子的整体健康负责。 我可以让日志永远build立起来,在时间的充裕中可能无所谓,但是我想尽我所能来统治日志,因为我知道最终的pipe理员不会做任何事情。 所以,使用crontab运行logrotate对我来说是不可能的。 我只是在寻找一些我可以用一个命令的有限点来完成的事情。

如果你的sed版本具有--in-place开关,你可以使用它。 它仍然是一个cpmv但它在幕后,所以脚本看起来不那么混乱,取决于你对sed语法的感觉。 否则,你的tail (你错过了你的编辑)和append方法是我的方式。

另一种使用sed方法是在开始时用最新的条目保持日志颠倒。

 sed -ni '1s/^/New Entry\n/;100q;p' logfile 

这就是它的一切(除了让“新条目”成为你想要的)。 这将保持一个滚动的100行日志文件反向时间顺序。 好处是,你不必知道文件中有多less行( tail为你处理,但sed不会)。 这在一定程度上假定您的日志条目由一行组成。 如果你从一个脚本logging了大量的输出,我想你会回到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 

一般来说,我会build议你不要担心日志大小。 pipe理这个标准的方法是使用logrotate。 让pipe理员决定需要多大的日志。 作为一个好的* nix应用程序的一部分,我相信它是坚持共同的标准,人们生气时,一个应用程序做一些不寻常的事情。

这是不可取的,因为没有办法删除文件的第一行而不重写整个文件。 取决于密集操作的文件大小。 即使你真的想这样做,这两种方法(取而代之,重新创build)将导致尾巴看不到新的线条,或者认为所有的线条都是新的。

我不得不同意logrotate等人的Kyle。 但是,如果你已经死定了从你的应用程序控制它,尝试谷歌search类似的东西:linux循环日志文件

这是一个类似的post,为我提供了两个很好的答案: 将一个日志文件转换成一个循环缓冲区

我有同样的问题,我很高兴地使用ulogbufd 。