我正在尝试将我的一些shell脚本的输出logging到一个文件中,并且我希望每行预置的时间戳。 从我所了解的情况来看,这就是logger(1)的logger(1) ,但我不希望输出到/ var / log / messages,而且我也看不出使用logger的可能性。 我正在使用Debian。
做这个的最好方式是什么?
-Oliver
logging器的function实际上是将消息分stream到syslog; 默认configuration会预先添加一个时间戳,并将日志写入/ var / log / messages,但这并不意味着logging器的目的是预先添加一个时间戳。
处理这种情况的一种方法是修改你的系统日志configuration,这样你的消息通过logging器路由到一个特殊的文件 – 使用“-p”标志logging器来规定一个facility.priority对(也许是用户之一[1。 .7]设施),并configuration您的syslogd将该设施logging到特殊文件。
另外,你也可以使用一个快速的shell函数来简单地添加时间戳:
Bodacious:~ james$ timestamp () { > f=`date` > echo $f $* > } You have new mail in /var/mail/james Bodacious:~ james$ timestamp a line of logs Tue 18 Jan 2011 22:40:24 EST a line of logs Bodacious:~ james$
在我的系统上,这将导致shell每行输出一次/ bin / date一次。 这是低效的,但在小规模可能是可以接受的。
我需要这样的东西,谷歌让我在这里。 使用类似syslog的东西肯定是一个矫枉过正的时间,每秒打印输出太麻烦了。
这是一个似乎很好的单线程:
cmd | { while read R; do echo "$(date +%s) $R"; done }
以及一个打印每行产生时间的变体:
cmd | { T=$(date +%s); while read R; do T2=$(date +%s); echo "$((T2-T)) $R"; T=$T2; done }
(这是使用秒,可能不是很难在那里扔%N,但在那个级别的壳解决scheme可能不是正确的工具。)
您可以使用-t标记每行,然后让您的系统日志服务器根据该标记过滤到不同的文件。
(编辑取出对-f标志的不正确引用)
使用命令的答案来预先给每行的string? ,我发现这是最简单的解决scheme:
cmd | sed "s/^/`date +'%a %b %d %k:%M:%S'` /"