Запись в пользовательский файл журнала из скрипта Bash
В Linux я знаю, как написать просто сообщение в файл /var/log/messages
, в простой оболочке script, которую я создал:
#!/bin/bash
logger "have fun!"
Я хочу прекратить бросать сообщения в файл /var/log/messages
по умолчанию и создать свой собственный.
Я пробовал это:
#!/bin/bash
logger "have more fun" > /var/log/mycustomlog
Он все еще записывается в /var/log/messages
. Он создал /var/log/mycustomlog
, но он пуст.
Кто-нибудь видит, что мне не хватает?
Ответы
Ответ 1
logger
регистрируется на средства syslog. Если вы хотите, чтобы сообщение перешло к определенному файлу, вам необходимо соответствующим образом изменить конфигурацию syslog. Вы можете добавить строку следующим образом:
local7.* -/var/log/mycustomlog
и перезапустить syslog. Затем вы можете сделать следующее:
logger -p local7.info "information message"
logger -p local7.err "error message"
и сообщения появятся в нужном файле журнала с правильным уровнем журнала.
Без внесения изменений в конфигурацию syslog вы можете использовать logger
следующим образом:
logger -s "foo bar" 2>> /var/log/mycustomlog
Это даст указание logger
также распечатать сообщение в STDERR (в дополнение к протоколированию его в syslog), чтобы вы могли перенаправить STDERR в файл. Тем не менее, это было бы совершенно бессмысленно, потому что сообщение уже зарегистрировано через syslog в любом случае (с приоритетом по умолчанию user.notice
).
Ответ 2
@chepner делает хорошую точку, что logger
предназначен для протоколирования сообщений.
Мне нужно упомянуть, что @Томас Харатик просто спросил, почему я просто не использовал echo
.
В то время я не знал об эхо, поскольку я изучаю shell-scripting
, но он был прав.
Мое простое решение теперь:
#!/bin/bash
echo "This logs to where I want, but using echo" > /var/log/mycustomlog
Приведенный выше пример перезапишет файл после >
Итак, я могу добавить к этому файлу следующее:
#!/bin/bash
echo "I will just append to my custom log file" >> /var/log/customlog
Спасибо, ребята!
- на стороне примечания, это просто мое личное предпочтение сохранить мои личные журналы в
/var/log/
, но я уверен, что есть и другие хорошие идеи. И поскольку я не создал демона, /var/log/
, вероятно, не лучшее место для моего пользовательского файла журнала. (просто говоря)
Ответ 3
Существует большое количество подробностей о регистрации сценариев оболочки через глобальные переменные оболочки. Мы можем эмулировать подобный вид регистрации в сценарии оболочки: http://www.cubicrace.com/2016/03/efficient-logging-mechnism-in-shell.html В посте подробно рассказывается о вводимых уровнях журналов, таких как INFO, DEBUG, ОШИБКА. Отслеживание таких деталей, как запись скрипта, выход скрипта, запись функции, выход из функции.
Журнал образцов: ![enter image description here]()
Ответ 4
Если вы видите справочную страницу журнала:
$ man logger
LOGGER (1) Руководство по общим командам BSD LOGGER (1)
NAME logger - интерфейс командной оболочки для системного журнала syslog (3) модуль
Логгер SYNOPSIS [-isd] [-f файл] [-p pri] [-t tag] [-u socket] [сообщение...]
ОПИСАНИЕ Logger делает записи в системном журнале. Он обеспечивает интерфейс командной строки оболочки для модуля системного журнала syslog (3).
Ясно, что он будет записываться в системный журнал. Если вы хотите войти в файл, вы можете использовать " → " для перенаправления на файл журнала.
Ответ 5
Я сделал это с помощью фильтра. В наши дни большинство систем Linux используют rsyslog. Файлы конфигурации находятся в /etc/rsyslog.conf
и /etc/rsyslog.d
.
Всякий раз, когда я запускаю командный logger -t SRI some message
, я хочу, чтобы "некоторое сообщение" отображалось только в /var/log/sri.log
.
Для этого я добавил файл /etc/rsyslog.d/00-sri.conf
со следующим содержимым.
# Filter all messages whose tag starts with SRI
# Note that 'isequal, "SRI:"' or 'isequal "SRI"' will not work.
#
:syslogtag, startswith, "SRI" /var/log/sri.log
# The stop command prevents this message from getting processed any further.
# Thus the message will not show up in /var/log/messages.
#
& stop
Затем перезапустите службу rsyslogd:
systemctl restart rsyslog.service
Вот сеанс оболочки, показывающий результаты:
[[email protected] html]# logger -t SRI Hello World!
[[email protected] html]# cat /var/log/sri.log
Jun 5 10:33:01 rpm-server SRI[11785]: Hello World!
[[email protected] html]#
[[email protected] html]# # see that nothing shows up in /var/log/messages
[[email protected] html]# tail -10 /var/log/messages | grep SRI
[[email protected] html]#