Como dizer ao rsyslog para criar um arquivo de log, se não existe?

11

O comportamento padrão do rsyslog é anexar rastreios a um arquivo de log existente .

Agora, vi (CentOs, Scientific Linux) que, quando o rsyslog já está em execução, você exclui o arquivo de log (por exemplo, o dedicado aos rastreamentos de log de seu aplicativo) e executa seu aplicativo, rsyslog não criará um arquivo de log e nenhum rastreio será gravado.

Existe alguma opção de configuração que possa dizer ao rsyslog para criar um arquivo de log se ele não existir antes de anexar rastreios a ele?

Observação : fazer um service rsyslog restart forçará a criação de um arquivo de log vazio.

rsyslog.conf (nada adicionado a ele)

# 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 ###
    
por fduff 26.09.2013 / 20:10

2 respostas

9

Do POV do rsyslog, o arquivo de log excluído ainda existe. Isso ocorre porque o rsyslog não está gravando no nome do arquivo, ele está gravando no identificador de arquivo que ele abriu para o arquivo de log.

Os sistemas Unix na verdade não excluem um arquivo até que não haja processos com identificadores abertos para o arquivo. Isso significa que o espaço em disco usado pelo arquivo excluído não é liberado até que todas e quaisquer alças de arquivo abertas sejam fechadas. Isso também significa que qualquer processo com identificadores de arquivos abertos para o arquivo excluído pode continuar lendo e / ou gravando no arquivo.

Enviar um sinal HUP (por exemplo, via pkill -HUP rsyslog ou /etc/init.d/rsyslog rotate ) para o rsyslog diz para fechar todos os arquivos abertos, recarregar seu arquivo de configuração e reabrir todos os arquivos de log para gravação (criando-os se necessário).

Reiniciar o rsyslogd também funciona.

Observe que isso é um recurso, não um bug, com algumas implicações úteis - por exemplo, é por isso que o rsyslog continua gravando no mesmo arquivo de log mesmo após ter sido rotacionado (ou seja, renomeado / mv-ed) até que o rsyslog receba um sinal HUP. Isso significa que os scripts de processamento de registro & os utilitários não precisam ser escrupulosamente cuidadosos com o tempo - eles podem simplesmente rotacionar todos os logs, enviar ao rsyslog um HUP e tudo continua funcionando, sem perda de dados de log.

BTW, a única maneira de isso não acontecer com o rsyslog seria se ele fosse fechado e reaberto a cada arquivo de log a cada gravação (ou pelo menos chamado sync() ). O desempenho seria abismal.

    
por 26.09.2013 / 23:19
3

$ FileCreateMode

Essa opção não faz o que você deseja, $ FileCreateMode ?

trecho

$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

Módulo de saída de arquivo

De acordo com a documentação do rsyslog, o argumento File do File Output Module pode ser usado para fazer isso.

excerto módulo omfile

File

If the file already exists, new data is appended to it. Existing data is not truncated. If the file does not already exist, it is created. Files are kept open as long as rsyslogd is active. This conflicts with external log file rotation. In order to close a file after rotation, send rsyslogd a HUP signal after the file has been rotated away.

Enviar syslog a um sinal HUP

Acho que, em última análise, você precisa "acionar" o rsyslog para fazer isso. Eu não acho que será o que você quer automaticamente. Então você poderia dar a ele um sinal HUP para acionar a recriação do arquivo de log após ele ser deletado.

$ sudo pkill -HUP rsyslog

Ao fazer isso, criamos as seguintes mensagens no meu arquivo de log /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'.
    
por 26.09.2013 / 20:26