通常在我的bash脚本中,我习惯做some_command >> log.log
。这工作正常,但是如何添加更多数据,如时间和命令名称?
我的目标是拥有这样的日志
2012-01-01 00:00:01 [some_command] => some command output...
2012-01-01 00:01:01 [other_command] => other command output...
进程应该同时运行并写入文件。
William Pursell指出的最终解决方案是:
some_command 2>&1 | perl -ne '$|=1; print localtime . ": [somme_command] $_"' >> /log.log &
我还添加了2>&1
来将STDOUT
和STDERR
重定向到文件,并将&
重定向到最后,以使程序保持在后台。
谢谢!
答案 0 :(得分:2)
使用sed的替代解决方案是:
some_command 2>&1 | sed "s/^/`date '+%Y-%m-%d %H:%M:%S'`: [some_command] /" >> log.log &
它通过替换行“character”(^)的开头来工作。如果你不想依赖Perl,可能会派上用场。
答案 1 :(得分:1)
类似的东西:
(echo -n $(date); echo -n " ls => "; ls) >> /tmp/log
但是,您的命令输出是多行,并且它不会显示您正在显示的上述格式。在这种情况下,您可能希望使用tr或sed等命令替换输出中的换行符。
答案 2 :(得分:1)
鉴于您的意见,您似乎希望多个进程同时写入文件,并在每个单独的行上都有一个时间戳。这样的事情就足够了:
some_cmd | perl -ne '$|=1; print localtime . ": [some_cmd] $_"' >> logfile
如果您想按摩日期格式,请使用POSIX :: strftime
some_cmd | perl -MPOSIX -ne 'BEGIN{ $|=1 }
print strftime( "%Y-%m-%d %H:%M:%S", localtime ) . " [some_cmd] $_"' >> logfile
答案 3 :(得分:1)
在Ubuntu上:
sudo apt-get install moreutils
echo "cat" | ts
Mar 26 09:43:00 cat
答案 4 :(得分:0)
一种方法是use logger(1).
另一个可能是这样的:
stamp () {
( echo -n "`date +%T` "
"$@" ) >> logfile
}
stamp echo how now brown cow