Я часто пишу файлы журналов в /tmp или /var при создании больших или сложных скриптов bash, чтобы помочь в отладке или просто отслеживать ход выполнения программы. Обычно я делаю что-то похожее, echo "$(date '+%Y-%m-%d_%H:%M:%S') something happened" > /tmp/log
что нормально, но не то, что можно легко вставить в программы, ожидающие "стандартный" формат syslog (шутки Apache в сторону). Я пытался получить команду logger
для создания нового файла журнала где-то, но, похоже, для этого нет возможности. Я подозреваю, что он оставляет эту часть syslogd и его конфигурации facility.
Я мог бы изменить свой «стандартный» формат, указанный выше, включив в него имя хоста, номер койки и PID, но, вероятно, есть другие нюансы и форматы, которые я мог упустить из виду, и которые кто-то уже разобрался.
Есть ли похожая утилита, logger
которая может записывать файл журнала в формате RFCxxx без прохождения через syslog?
решение1
Я думаю, это можно сделать вручную...
Самое интересное — это различные форматы. Вот функции для Bash, которые создают обаRFC5424иRFC3164Сообщения в стиле. Форматы %06N
и %:z
в метке времени первого могут потребовать дату GNU, я не уверен.
#!/bin/bash
# print RFC 5424 syslog message, without structured data,
# somewhat like 'logger -i --rfc5424=notq', e.g.
# <13>1 2021-10-28T14:48:10.613772+03:00 myhost ilkkachu 20415 - - a problem happened
# format is
# <prio>version date host tag pid - - message
lognew() {
local facility="${log_facility-5}" # default 'user'
local severity="$1"
shift
local prio=$(( facility*8 + severity ))
local version=1
local date=$(date +"%Y-%m-%dT%H:%M:%S.%06N%:z")
local tag="${log_tag-$USER}" # default to username
local pid="$$"
local IFS=" "
local message="$*"
printf "<%d>%d %s %s %s %d - - %s\n" "$prio" "$version" "$date" "$HOSTNAME" "$tag" "$pid" "$message"
}
# print RFC 3164 syslog message,
# somewhat like 'logger -i --rfc3164'
# <13>Oct 28 14:49:13 myhost ilkkachu[20418]: another problem happened
# format:
# <prio>date host tag[pid]: message
logold() {
local facility="${log_facility-5}" # default 'user'
local severity="$1"
shift
local prio=$(( facility*8 + severity ))
local date=$(LC_ALL=C date +"%b %_d %H:%M:%S")
local tag="${log_tag-$USER}" # default to username
local pid="$$"
local IFS=" "
local message="$*"
printf "<%d>%s %s %s[%d]: %s\n" "$prio" "$date" "$HOSTNAME" "$tag" "$pid" "$message"
}
log_facility=1 # user
log_tag="test"
# 6 = info
lognew 6 testing messaging
# 4 = warning
logold 4 obsolete message format
Выведенный PID соответствует PID скрипта, а вывод выглядит примерно так:
<14>1 2021-10-28T15:06:17.413125+03:00 myhost test 20499 - - testing messaging
<12>Oct 28 15:06:17 myhost test[20499]: obsolete message format