Я пытаюсь записать вывод некоторых моих сценариев оболочки в файл, и я хочу, чтобы к каждой строке добавлялась временная метка. Насколько я понял, вот что 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
флаг)