У меня есть несколько серверов, ведущих журнал на центральном сервере системного журнала, которые собирают журналы с помощью syslog-ng.
Я отправляю журналы с тегом с помощью команды logger:
$ logger -n 01.02.03.04 "Hello from $HOST at $(date)" -t MY_SPECIFIC_TAG -p local2.error
Затем с помощью syslog-ng сообщение записывается следующим образом:
Mar 5 23:36:04 05.06.07.08 MY_SPECIFIC_TAG: Hello from vps1234567 at Tue Mar 5 23:36:04 CET 2019
Моя цель - заставить все приложения (java, apache, mysql, ...) отправлять свои журналы, используя тег, который идентифицирует приложение, генерирующее сообщение, чтобы я мог записывать журналы на моем syslog-сервере в файл, соответствующий имени приложение.
Можно ли извлечь строку MY_SPECIFIC_TAG из сообщения и использовать его как переменную в пути к файлу?
Это извлечение необходимо выполнить в файле конфигурации syslog-ng, поэтому я могу записать места назначения следующим образом:
destination dst_custom{
file("${MY_SPECIFIC_TAG}-${FACILITY}-${LEVEL}-${YEAR}-${MONTH}-${DAY}.log");
};
Хорошо, решил:
Макрос syslog-ng ${PROGRAM}
извлеките эту информацию.
БЛУФ: Да, это так.
В: Если вы уже знаете тег, зачем вам его извлекать?
Позиция 1: Я знаю MY_SPECIFIC_TAG и хотите извлечь его из файла сообщений:
grep MY_SPECIFC_TAG /var/log/messages | sed -n "1s/^[A-Z][a-z][a-z] [0-9:.]* (.):./\1/p"
Это должно дать вам MY_SPECIFIC_TAG (или, по крайней мере, довольно близко). YMMV
Позиция 2: Я знаю MY_SPECIFIC_TAG но я не знаю путь перед ним (т.е. / path / to / program / MY_SPECIFIC_TAG)
grep MY_SPECIFC_TAG /var/log/messages | sed -n "1s+^[A-Z][a-z][a-z] [0-9:.]* (/[a-zA-Z0-9/]/.): .*+\1+p"
Это то, что вы ищете?
Чтобы установить это как переменную, поместите всю команду внутри $ () и используйте это как правую часть задания.
my_path_var=$( {command from above} )
ОБНОВИТЬ: Если ты не знаешь что MY_SPECIFIC_TAG есть, и вы хотите их найти:
cat /var/log/messages | sed -n "s/^[A-Z][a-z][a-z] [0-9:.]* (.):./\1/p" | sort -u
Это не будет печатать строки без тега.
Теперь перед вами все "УУОК!" на мне, я сделал это таким образом, чтобы показать сравнение этой команды со старой командой. Таким образом, OP (и другие будущие читатели) могут легко адаптировать эти команды к своей системе.
Примечание: UUOC = ненужное использование кат. Имя файла можно поместить после п" и команда cat удалена. Однако в демонстрационных целях здесь используется кошка.