Назад | Перейти на главную страницу

Запись в файл с добавлением метки времени к каждой строке (Debian)

Я пытаюсь записать вывод некоторых моих сценариев оболочки в файл, и я хочу, чтобы к каждой строке добавлялась временная метка. Насколько я понял, вот что logger(1) предназначен для, но я не хочу, чтобы вывод попадал в / var / log / messages, и я не вижу, что это возможно с помощью регистратора. Кстати, я использую Debian.

Как лучше всего это сделать?

-Оливер

Функция регистратора на самом деле состоит в том, чтобы шунтировать сообщения в системный журнал; Конфигурации по умолчанию добавят временную метку и будут записывать журналы в / var / log / messages, но это не означает, что цель регистратора - добавить временную метку.

Один из способов справиться с этим - изменить конфигурацию системного журнала таким образом, чтобы сообщения, маршрутизируемые через регистратор, попадали в специальный файл - используйте флаг "-p" для регистрации, чтобы указать пару объект.приоритет (возможно, один из пользователей [1. .7]) и сконфигурируйте ваш syslogd для записи этой возможности в специальный файл.

В качестве альтернативы вы можете создать быструю функцию оболочки, чтобы просто добавить метку времени:

Bodacious:~ james$ timestamp () {
> f=`date`
> echo $f $*
> }
You have new mail in /var/mail/james
Bodacious:~ james$ timestamp a line of logs
Tue 18 Jan 2011 22:40:24 EST a line of logs
Bodacious:~ james$ 

В моей системе это приведет к тому, что оболочка будет разветвлять / bin / date один раз для каждой строки вывода. Это неэффективно, но, вероятно, приемлемо в небольших масштабах.

Мне нужно было что-то в этом роде, и Google привел меня сюда. Использование чего-то вроде syslog - определенно излишество, если вы просто пытаетесь что-то рассчитать, а ежесекундная распечатка слишком неудобна.

Вот однострочник, который, кажется, работает нормально:

cmd | { while read R; do echo "$(date +%s) $R"; done }

и вариант, который печатает время, необходимое для создания каждой строки:

cmd | { T=$(date +%s); while read R; do T2=$(date +%s); echo "$((T2-T)) $R"; T=$T2; done }

(Это использует секунды, вероятно, не слишком сложно добавить туда% N, но на этом уровне решение оболочки, вероятно, в любом случае не подходит.)

Используя ответ от Команда для добавления строки к каждой строке?, Я нашел это самое простое решение:

cmd | sed "s/^/`date +'%a %b %d %k:%M:%S'` /"

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

(Отредактировано, чтобы удалить неверную ссылку на -f флаг)