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

Есть ли простой способ вставить данные / время перед файлом журнала с помощью сценариев оболочки?

Скажем, я хочу отслеживать использование памяти в процессе Java в одночасье.

Я могу сделать что-то вроде

наверх | grep java> out.log

Я получу лог-файл с кучей строк.

Есть ли простой способ вставить данные / время перед каждой строкой?

Не изобретайте велосипед. Записывать сообщения в системный журнал, используя регистратор (1), который поддерживается практически всеми версиями Unix. Системный журнал позаботится о временных метках за вас. Данные вашего журнала будут храниться в системном журнале, например /var/log/messages (Это можно настроить). Вам не нужно беспокоиться об очистке файлов журналов позже (особенно, если это задание выполняется постоянно), потому что системные журналы автоматически меняются с помощью logrotate / newsyslog.

top | grep java | logger -t java_cpuhog

Или, если вы действительно хотите записать его в свой собственный файл. Но потом вам нужно очистить файл:

top | grep java | logger -t java_cpuhog -f /var/log/java-top.log
... | awk -f timetag.awk > ...

timetag.awk:

{
  print "[" strftime() "] " $0
}

В ракушке: top | grep java | while read LINE ; do date "+%F %T ${LINE}" ; done

Вы могли бы создать что-то вроде stamp содержащий

#!/usr/bin/perl -p
s/^/localtime()." "/e;

Тогда беги

top -b | grep java | stamp > out.log

Не забывайте использовать top -b если вы не используете его в интерактивном режиме. Конечно, top уже ставит отметку времени при каждом запуске. Если вам не обязательно нужна дата в каждой строке, просто используйте вершину отдельно, поскольку она ставит отметку времени на каждой итерации. Я иногда использую это, чтобы получить 10-секундные образцы на целый день, чтобы просмотреть их позже:

top -b -d 10 -c -n 8640