3

通常在我习惯做的 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 &

我还添加了将and2>&1重定向到文件,最后添加了 an 以使程序保持在后台。STDOUTSTDERR&

谢谢!

4

5 回答 5

3

使用 sed 的替代解决方案是:

some_command 2>&1 | sed "s/^/`date '+%Y-%m-%d %H:%M:%S'`: [some_command] /" >> log.log &

它通过替换行“字符”(^)的开头来工作。如果您不想依赖 Perl,可能会派上用场。

于 2013-05-31T07:36:41.913 回答
2

鉴于您的评论,您似乎希望多个进程同时写入文件,并在每一行上都有一个时间戳。这样的事情可能就足够了:

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
于 2012-05-31T18:21:20.513 回答
1

像这样的东西:

(echo -n $(date); echo  -n " ls => ";  ls) >> /tmp/log

但是,您的命令输出是多行的,并且不会具有您显示的上述格式。在这种情况下,您可能希望使用 tr 或 sed 之类的命令将输出中的换行符替换为其他字符。

于 2012-05-31T18:17:06.253 回答
1

在 Ubuntu 上:

sudo apt-get install moreutils
echo "cat" | ts
Mar 26 09:43:00 cat
于 2014-03-26T08:43:37.557 回答
0

一种方法是使用 logger(1)。

另一个可能是这样的:

stamp () {
  ( echo -n "`date +%T` "
    "$@" ) >> logfile
}

stamp echo how now brown cow
于 2012-05-31T18:19:41.180 回答