Как добавить строку даты в каждую строку непрерывно записываемого файла журнала - PullRequest
7 голосов
/ 16 июня 2011

Имея долго работающую программу, которая непрерывно записывает в файл журнала - как возможно, не обращая внимания на любые проблемы с буферизацией, добавить строку даты в каждую строку, записанную в этот файл, используя скрипт 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

Ответы [ 6 ]

22 голосов
/ 16 июня 2011

С perl:

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

С gawk:

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

Замените command на tail -f logfile для вашего конкретного примера.Или, возможно, вы могли бы просто перенаправить stdout / stderr исходной программы на вышеуказанный канал.

6 голосов
/ 16 июня 2011

Попробуйте

tail -f logfile | while read line; do echo `date` "$line" ; done
5 голосов
/ 26 февраля 2013

Вы можете попробовать это

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.
2 голосов
/ 16 июня 2011

Немного долго, но вот что я придумал:

tail -f logfile | sed -u 's/%/%%/g' | xargs -I {} date +"%Y-%m-%d %H:%M:%S {}"
0 голосов
/ 26 февраля 2013

Или вы можете использовать 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
0 голосов
/ 16 июня 2011

Можете ли вы настроить долго работающую программу для записи ее вывода в стандартный вывод, а не в файл журнала? В этом случае было бы легко перенаправить вывод в скрипт, который сначала записывает текущую метку времени, а затем запись.

Если это невозможно, это может помочь периодически (например, каждую секунду) читать содержимое файла журнала, копировать каждую строку в другой файл (добавляя текущую метку времени) и затем удалять файл журнала. Однако это может привести к потере записей в лог-файле, которые записываются между чтением и удалением файла: (

...