Подтвердить что ты не робот

Запись в пользовательский файл журнала из скрипта 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, но он пуст.

Кто-нибудь видит, что мне не хватает?

4b9b3361

Ответ 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]#