记录到文件,在每行前面添加时间戳(Debian)

记录到文件,在每行前面添加时间戳(Debian)

我正在尝试将一些 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'` /"

相关内容