如何将datestring添加到连续写入的日志文件的每一行

有一个长期运行的程序,不断写入日志文件 – 这是怎么可能的,忽略任何缓冲问题,添加一个datestring写入到该文件使用Linux脚本的每一行?

我会想像这样的事情:

tail -f logfile | ADD_DATE_TO_EACH_LINE > logfile2 

input将是这样的:

 abc def ghi jkl 

输出应该类似于:

 2011-06-16 18:30:59 abc 2011-06-16 18:31:00 def 2011-06-16 18:35:21 ghi 2011-06-16 18:40:15 jkl 

用perl:

 command 2>&1 | perl -pe 'print scalar(localtime()), " ";' 

用gawk:

 command 2>&1 | awk '{ print strftime(), $0; fflush() }' 

使用tail -f logfile替换您的具体示例的命令。 或者,也许你可以将原始程序的stdout / stderr重定向到上面的管道。

你可以试试这个

 cat /etc/motd | xargs -d"\n" -I {} date +"%Y-%m-%d %H:%M:%S {}" 

示例输出:

 2013-02-26 15:13:57 
 Debian GNU / Linux系统包含的程序是自由软件,
 2013-02-26 15:13:57每个程序的确切分配条件都在描述中
个人档案在/ usr / share / doc / * / copyright。
 2013-02-26 15:13:57 
 2013-02-26 15:13:57 Debian GNU / Linux自带绝对不担保,在一定程度上
 2013-02-26 15:13:57适用法律允许。

尝试

 tail -f logfile | while read line; do echo `date` "$line" ; done 

有点冗长,但这是我想出来的:

 tail -f logfile | sed -u 's/%/%%/g' | xargs -I {} date +"%Y-%m-%d %H:%M:%S {}" 

你能配置长时间运行的程序把它的输出写到标准输出而不是日志文件吗? 在这种情况下,可以很容易地将输出传送到一个脚本,它首先写入当前时间戳,然后写入条目。

如果这是不可能的,则可以帮助定期(例如每秒)读取日志文件内容,将每行复制到另一个文件(添加当前时间戳),然后删除日志文件。 然而,这可能会强加在读取和删除文件之间写入丢失的日志文件条目:(

或者你可以使用python …

cat /dev/urandom | python -c "from __future__ import print_function; import sys; import datetime; map(lambda x: print(datetime.datetime.now(), x), [line for line in sys.stdin.readlines()])"

或者使用GNU屏幕

 screen -a ls -lh -L -U -X command 

首先你需要在〜/ .screenrc中启用日志记录和时间戳。

 logfile /tmp/screen-%S-%n.log logtstamp on