我正在尝试将一些 shell 脚本的输出记录到一个文件中,并且我希望在每行前面添加时间戳。据我所知,这就是目的logger(1)
,但我不想将输出发送到 /var/log/messages,而且我看不出使用 logger 可以做到这一点。顺便说一下,我使用的是 Debian。
做这个的最好方式是什么?
—奥利弗
答案1
logger 的功能实际上是将消息分流到 syslog;默认配置将在前面添加时间戳并将日志写入 /var/log/messages,但这并不意味着 logger 的目的是在前面添加时间戳。
处理此问题的一种方法是修改您的 syslog 配置,以便通过记录器路由的消息转到特殊文件 - 使用“-p”标志来记录器以规定设施.优先级对(可能是用户[1..7]设施之一),并配置您的 syslogd 以将该设施记录到一个特殊文件中。
或者,你可以快速运行一个 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。这效率很低,但在小规模下可能可以接受。
答案2
我需要这样的东西,谷歌帮我找到了。使用像 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,但在那个级别,shell 解决方案可能不是正确的工具。)
答案3
您可以用来-t
标记每一行,然后让您的系统日志服务器根据该标记过滤到不同的文件。
(已编辑,删除了对-f
旗帜的错误引用)
答案4
使用来自的答案将字符串添加到每行前面的命令?,我发现这是最简单的解决方案:
cmd | sed "s/^/`date +'%a %b %d %k:%M:%S'` /"