Как сказать rsyslog создать файл журнала, если его там нет?

12

Поведение rsyslog по умолчанию заключается в добавлении трасс в существующий файл журнала.

Теперь я видел (CentOs, Scientific Linux), что когда rsyslog уже запущен, вы удаляете файл журнала (например, файл, предназначенный для отслеживания журналов из вашего приложения), затем вы запускаете приложение, rsyslog не будет создавать файл журнала и никаких следов не будет записано.

Есть ли опция конфигурации, которая может указать rsyslog создать файл журнала, если его там нет, прежде чем добавлять к нему следы?

Примечание : выполнение service rsyslog restartзаставит создать пустой файл журнала.

rsyslog.conf (ничего не добавлено)

# rsyslog v5 configuration file

# For more information see /usr/share/doc/rsyslog-*/rsyslog_conf.html
# If you experience problems, see http://www.rsyslog.com/doc/troubleshoot.html

#### MODULES ####

$ModLoad imuxsock # provides support for local system logging (e.g. via logger command)
$ModLoad imklog   # provides kernel logging support (previously done by rklogd)
#$ModLoad immark  # provides --MARK-- message capability

$SystemLogRateLimitInterval 1
$SystemLogRateLimitBurst 50000

# Provides UDP syslog reception
#$ModLoad imudp
#$UDPServerRun 514

# Provides TCP syslog reception
#$ModLoad imtcp
#$InputTCPServerRun 514


#### GLOBAL DIRECTIVES ####

# Use default timestamp format
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat

# File syncing capability is disabled by default. This feature is usually not required,
# not useful and an extreme performance hit
#$ActionFileEnableSync on

# Include all config files in /etc/rsyslog.d/
$IncludeConfig /etc/rsyslog.d/*.conf


#### RULES ####

# Log all kernel messages to the console.
# Logging much else clutters up the screen.
#kern.*                                                 /dev/console

# Log anything (except mail) of level info or higher.
# Don't log private authentication messages!
*.info;mail.none;authpriv.none;cron.none;local1.none    /var/log/messages

# The authpriv file has restricted access.
authpriv.*                                              /var/log/secure

# Log all the mail messages in one place.
mail.*                                                  -/var/log/maillog


# Log cron stuff
cron.*                                                  /var/log/cron

# Everybody gets emergency messages
*.emerg                                                 *

# Save news errors of level crit and higher in a special file.
uucp,news.crit                                          /var/log/spooler

# Save boot messages also to boot.log
local7.*                                                /var/log/boot.log

# ### begin forwarding rule ###
# The statement between the begin ... end define a SINGLE forwarding
# rule. They belong together, do NOT split them. If you create multiple
# forwarding rules, duplicate the whole block!
# Remote Logging (we use TCP for reliable delivery)
#
# An on-disk queue is created for this action. If the remote host is
# down, messages are spooled to disk and sent when it is up again.
#$WorkDirectory /var/lib/rsyslog # where to place spool files
#$ActionQueueFileName fwdRule1 # unique name prefix for spool files
#$ActionQueueMaxDiskSpace 1g   # 1gb space limit (use as much as possible)
#$ActionQueueSaveOnShutdown on # save messages to disk on shutdown
#$ActionQueueType LinkedList   # run asynchronously
#$ActionResumeRetryCount -1    # infinite retries if host is down
# remote host is: name/ip:port, e.g. 192.168.0.1:514, port optional
#*.* @@remote-host:514
# ### end of the forwarding rule ###
fduff
источник
Можете ли вы поделиться своим .conf файлом?
SLM

Ответы:

10

Из POV rsyslog удаленный файл журнала все еще существует. Это связано с тем, что rsyslog не записывает имя файла, а записывает его в дескриптор файла, открытый для файла журнала.

Unix-системы на самом деле не удаляют файл, пока в нем нет процессов с открытыми дескрипторами. Это означает, что дисковое пространство, используемое удаленным файлом, не освобождается до тех пор, пока не будут закрыты все и все дескрипторы открытых файлов. Это также означает, что любые процессы с дескрипторами открытого файла для удаленного файла могут продолжить чтение и / или запись в файл.

Отправка сигнала HUP (например, через pkill -HUP rsyslogили /etc/init.d/rsyslog rotate) в rsyslog говорит ему закрыть все открытые файлы, перезагрузить файл конфигурации и заново открыть все файлы журнала для записи (создавая их при необходимости).

Перезапуск rsyslogd также работает.

Обратите внимание, что это функция, а не ошибка, с некоторыми полезными последствиями - например, именно поэтому rsyslog продолжает записывать в один и тот же файл журнала даже после того, как он был повернут (т.е. переименован / mv-ed), пока rsyslog не получит сигнал HUP. Это означает, что сценарии и утилиты обработки журналов не должны тщательно следить за синхронизацией - они могут просто вращать все журналы, отправлять rsyslog в HUP, и все продолжает работать без потери данных журнала.

Кстати, единственный способ избежать этого с rsyslog - это закрывать и заново открывать каждый файл журнала при каждой записи (или, по крайней мере, при вызове sync()). Производительность была бы ужасной.

саз
источник
Знаете ли вы, что команда kill -HUP to rsyslog инициирует запись в новый файл?
SLM
Вы имеете в виду, если rsyslog.conf изменился и был определен новый файл журнала? да, он определенно создаст и начнет запись в новый файл при получении HUP ... это часть перезагружаемой конфигурации.
Cas
Хорошо, это то, что я предложил в своем третьем методе, спасибо!
СЛМ
проблема в том, что rsyslog работает, вы удаляете файл журнала приложения (без перезапуска rsyslog), и тогда больше не будет регистрироваться трассировка, так как rsyslog не создаст файл журнала, если его там нет, пока он работает ...
fduff
1
Как я уже сказал, из POV rsyslog, этот дескриптор файла все еще существует. он не закроет и повторно не откроет / повторно создаст файлы журнала, пока вы не сообщите об этом путем перезапуска или с помощью сигнала HUP. rsyslog делает то, что вы говорите, не более того. что еще более важно, проблема не в том, что делает rsyslog, а в том, как вы понимаете поведение rsyslog и почему он так себя ведет.
CAS
3

$ FileCreateMode

Эта опция не делает то, что вы хотите, $ FileCreateMode ?

выдержка

$FileCreateMode 0600

This sample lets rsyslog create files with read and write access only for the 
users it runs under.

The following sample is deemed to be a complete rsyslog.conf:

$umask 0000 # make sure nothing interferes with the following definitions
*.* /var/log/file-with-0644-default
$FileCreateMode 0600
*.* /var/log/file-with-0600
$FileCreateMode 0644

*.* /var/log/file-with-0644

Модуль вывода файлов

Согласно документации rsyslog, для этого можно использовать аргумент File модуля File Output.

модуль выписки omfile

файл

Если файл уже существует, к нему добавляются новые данные. Существующие данные не усекаются. Если файл еще не существует, он создается. Файлы остаются открытыми, пока активен rsyslogd. Это конфликтует с ротацией внешнего файла журнала. Чтобы закрыть файл после поворота, отправьте rsyslogd сигнал HUP после того, как файл был повернут.

Отправить системный журнал сигнал HUP

Я думаю, что в конечном итоге вам нужно «запустить» rsyslog, чтобы сделать это. Я не думаю, что это будет то, что вы хотите автоматически. Таким образом, вы можете дать ему сигнал HUP, чтобы инициировать повторное создание файла журнала после его удаления.

$ sudo pkill -HUP rsyslog

Это создало следующие сообщения в моем /var/log/messagesфайле журнала:

Sep 26 15:16:17 grinchy rsyslogd: [origin software="rsyslogd" swVersion="4.6.3" x-pid="1245" x-info="http://www.rsyslog.com"] rsyslogd was HUPed, type 'lightweight'.
Sep 26 15:16:44 grinchy rsyslogd: [origin software="rsyslogd" swVersion="4.6.3" x-pid="1245" x-info="http://www.rsyslog.com"] rsyslogd was HUPed, type 'lightweight'.
SLM
источник
Нет, я использовал его для установки прав доступа к файлам, и это прекрасно работает. Проблема заключается в том, что если файл журнала был удален, syslog не будет пытаться создать его до регистрации сообщения.
2013 года
Он был удален, а сервер не был перезапущен?
SLM
точно. Я делаю некоторые тесты, и я столкнулся с этой особенностью ...
fduff
@fduff - посмотри мои обновления, попробуй третий!
SLM