2011-06-16 44 views
7

有一个持续写入日志文件的长时间运行的程序 - 如何可能,忽略任何缓冲问题,向写入该日志文件的每行添加日期字符串文件使用Linux脚本?如何将日期字符串添加到连续写入的日志文件的每一行

我会想象这样的事情:

tail -f logfile | ADD_DATE_TO_EACH_LINE > logfile2 

的投入将是类似的东西:

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 

回答

19

用Perl:

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

随着GAWK:

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

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

+0

谢谢 - 两个版本都很好用 – bmk 2011-06-16 17:22:11

+0

这个答案带来的好处是它不会在每一行产生一个新的日期过程,但是两者都能正常工作 – 2011-06-16 17:32:47

+0

'perl -pne' ??你不需要'-n'和'-p'。 – 2011-06-16 18:39:14

0

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

如果这是不可能的,它可能有助于定期(例如每秒)读取日志文件内容,将每行复制到另一个文件(添加当前时间戳),然后删除日志文件。这可能,但是,并处失去被读取和删除文件:(之间写入日志文件条目

+0

我无法将程序配置为记录到标准输出,因为它是(或可用作)交互式程序。但实际上执行'tail -f'在我看来与直接写入stdout差不多。其实我正在寻找那个“首先写入当前时间戳然后输入条目的脚本”。 – bmk 2011-06-16 17:09:58

+0

然后你可以使用FIFO。程序会将所有内容写入命名管道(fifo),并且可以在同一时间读取它,追加日期并写入真实的日志文件。 – reox 2014-09-29 12:50:34

4

尝试

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

+1尽管如此:使用'date +'%y-%m-%d%H:%M:%S“'而不是简单的'date'会导致他期望的确切输出;你也可以在最后添加重定向到输出文件。 (它实际上是两个音符):) – 2011-06-16 17:09:05

+0

谢谢你,这是有效的。如果你在'$ line'中加''''符号,shell不会将'*'符号扩展到目录内容;) – bmk 2011-06-16 17:14:35

+0

啊,好点!回答更新。 – aioobe 2011-06-16 17:20:42

1

有点冗长,但这里是我想出了:

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

这是一个非常好的解决方案。 ''sed -u's /%/ %%/g''代表'%'标志对'xargs'有特殊意义? – bmk 2011-06-16 17:30:36

+0

@bmk此方法通过将整行放入'date'的格式字符串中工作,其中'%'具有特殊含义。例如,如果日志中的行包含“%Y”,那么它将被年代替,但使用'sed'将其更改为'%% Y'将正确输出'%Y'。 – 2011-06-16 17:35:17

+0

好的 - 我明白了。非常棘手;) – bmk 2011-06-16 17:38:42

5

你可以试试这个

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

输出示例:

 
2013-02-26 15:13:57 
2013-02-26 15:13:57 The programs included with the Debian GNU/Linux system are free software; 
2013-02-26 15:13:57 the exact distribution terms for each program are described in the 
2013-02-26 15:13:57 individual files in /usr/share/doc/*/copyright. 
2013-02-26 15:13:57 
2013-02-26 15:13:57 Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent 
2013-02-26 15:13:57 permitted by applicable law. 
+0

如果输出包含%字符,则不起作用:echo%Y | xargs ... – Vouze 2015-09-18 12:03:39

+0

@Vouze你可以用'sed'来解决这个问题,或者实际上而不是[无用的'cat'](http://www.iki.fi/era/unix/award.html ); 'sed's /%/ %%/g'/ etc/motd | xargs ...' – tripleee 2016-08-31 04:58:46

0

或者你也可以使用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 
相关问题