Вопрос: Как добавить временную метку в журнал сценариев bash?


У меня есть постоянно запущенный скрипт, который я выводю в файл журнала:

script.sh >> /var/log/logfile

Я хотел бы добавить временную метку перед каждой строкой, прилагаемой к журналу. Подобно:

Sat Sep 10 21:33:06 UTC 2011 The server has booted up.  Hmmph.

Можно ли использовать джиу-джитсу?


72
2017-09-10 21:35


Источник


Смотрите этот квест. serverfault.com/questions/80749/..., Ответ на пара будет применяться здесь. - Zoredache
Для решения awk / gawk см.: stackoverflow.com/questions/21564/... - User


Ответы:


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

./script.sh | while IFS= read -r line; do echo "$(date) $line"; done >>/var/log/logfile

Если вы будете использовать это много, легко сделать функцию bash для обработки цикла:

adddate() {
    while IFS= read -r line; do
        echo "$(date) $line"
    done
}

./thisscript.sh | adddate >>/var/log/logfile
./thatscript.sh | adddate >>/var/log/logfile
./theotherscript.sh | adddate >>/var/log/logfile

74
2017-09-10 21:58



@ Нильс это трюк, чтобы предотвратить read от обрезки пробелов в начале и в строке. Он устанавливает IFS (внутренний полевой разделитель bash, в основном список символов пробела), который пуст для read команда. - Gordon Davisson
... и -r игнорирует escape-символ «\». Это должно действительно работать во всех случаях - большое количество сценариев. - Nils
@ Нильс это не совсем пуленепробиваемый, так как некоторые реализации echo интерпретировать escape-последовательности. если ты действительно хотите, чтобы он не возился с контентом (кроме добавления дат), замените echo команду с printf "%s %s\n" "$(date)" "$line" - Gordon Davisson
Вас может заинтересовать Соответствие ISO-8601 даты / времени: date -u +"%Y-%m-%dT%H:%M:%SZ" или, может быть, еще довольно date +"%Y-%m-%d %T", - Pablo Bianchi
в то время как этот скрипт работает так, как ожидалось, он запускает новый процесс (выполняется date) для каждый log, что может быть огромным недостатком в зависимости от вашей машины и количества журналов. Я бы предпочел использовать ts если доступно, см. ответ от @willem - Michael Schaefers


См. «Ts» из Ubuntu «moreutils» pkg:

command | ts

Или, если $ command выполняет автоматическую буферизацию (требуется ожидать-dev pkg):

unbuffer command | ts

39
2017-10-29 15:20





Вы можете просто эхо команда выводит в файл журнала. т.е.

echo "`date -u` `./script.sh`" >> /var/log/logfile

Это действительно работает :)

Пример:

[sparx@E1]$ ./script.sh 
Hello Worldy
[sparx@E1]$ echo "`date -u` `./script.sh`" >> logfile.txt
[sparx@E1]$ cat logfile.txt 
Mon Sep 12 20:18:28 UTC 2011 Hello Worldy
[sparx@E1]$ 

12
2017-09-10 22:03



Хм не работает для меня. - Antonius Bloch
Что вы получаете, когда выполняете команду? - SparX
Это помещает временную метку перед всем выходом './script.sh' ', но не перед каждой строкой. - clacke


Дата команда предоставит эту информацию

date -u
Sat Sep 10 22:39:24 UTC 2011

так что вы можете

echo $(date -u) "Some message or other"

это то, что вы хотели?


10
2018-02-03 17:23



Использование команды date было тем, что я имел в виду, но я не могу добавить это к самому сценарию, поэтому то, что я ищу, - это способ изменить эту строку: «script.sh >> / var / log / logfile ", чтобы добавить дату. - Antonius Bloch
В этом случае переадресуйте вывод своего сценария в именованный канал и попросите демона прослушивать вывод, который выводит результат скрипта, и добавляет дату перед записью в файл журнала. Возможно, вы можете изменить сценарий, который я написал здесь для этого. Я бы сделал это, потому что это меня интересует, но в Великобритании уже поздно, и завтра я начну рано. - Iain


Делать config.sh файл

#!/usr/bin/env bash
LOGFILE="/path/to/log.log"
TIMESTAMP=`date "+%Y-%m-%d %H:%M:%S"`

Когда вам нужно отправить в файл журнала

#!/usr/bin/env bash
source /path/to/config.sh

echo "$TIMESTAMP Say what you are doing" >> $LOGFILE

do_what_you_want >> $LOGFILE

Файл журнала будет выглядеть так:

2013-02-03 18:22:30 Say what you are doing

Таким образом, будет легко сортировать по дате


7
2017-09-12 20:34



Ваш '' config.sh '' будет запускать '' date '' ровно один раз, на '' source ... / config.sh ''. - clacke


Вы имеете в виду:

(date && script.sh) >> /var/log/logfile

5
2017-11-09 22:24



Мой бог, люди, все делают замену тика, именованные трубы и т. Д. Просто приложите команду даты и скрипт в parens! У парня, у которого есть функция, есть законный случай, если есть многострочный вывод, и журнал должен выглядеть красиво с датой в каждой строке, но большинство из этих решений являются излишними, которые не используют семантику оболочки. - cjc
Это добавит только временную метку один раз за выполнение script.sh, OP нуждается в отметке времени для каждой строки. - Dave Forgac
хотя это не отвечает на вопрос ОП, я все еще нашел его полезной информацией. - User


Принятый ответ https://serverfault.com/a/310104 может быть немного медленным, если необходимо обработать много строк, с накладными расходами на запуск date процесс, позволяющий приблизительно 50 строк в секунду в Ubuntu, и только около 10-20 в Cygwin.

когда bash можно предположить, что более быстрая альтернатива была бы printf встроенный с его %(...)T спецификатор формата. сравнить

>> while true; do date; done | uniq -c
     47 Wed Nov  9 23:17:18 STD 2016
     56 Wed Nov  9 23:17:19 STD 2016
     55 Wed Nov  9 23:17:20 STD 2016
     51 Wed Nov  9 23:17:21 STD 2016
     50 Wed Nov  9 23:17:22 STD 2016

>> while true; do printf '%(%F %T)T\n'; done | uniq -c
  20300 2016-11-09 23:17:56
  31767 2016-11-09 23:17:57
  32109 2016-11-09 23:17:58
  31036 2016-11-09 23:17:59
  30714 2016-11-09 23:18:00

3
2018-04-27 16:45