¿Cómo decirle a rsyslog que cree un archivo de registro si no está allí?

12

El comportamiento predeterminado de rsyslog es agregar rastros a un archivo de registro existente .

Ahora, he visto (CentOs, Scientific Linux) que cuando rsyslog ya se está ejecutando, eliminas el archivo de registro (por ejemplo, el que está dedicado a registrar rastros de tu aplicación), luego ejecutas tu aplicación, rsyslog no creará un archivo de registro y no se grabará ningún rastro.

¿Hay alguna opción de configuración que pueda decirle a rsyslog que cree un archivo de registro si no está allí antes de agregarle rastros?

Nota : hacer un service rsyslog restartforzará la creación de un archivo de registro vacío.

rsyslog.conf (nada agregado)

# 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
fuente
¿Puedes compartir tu archivo .conf?
slm

Respuestas:

10

Desde el punto de vista de rsyslog, el archivo de registro eliminado todavía existe. Esto se debe a que rsyslog no escribe en el nombre del archivo, sino en el identificador de archivo que tiene abierto para el archivo de registro.

Los sistemas Unix en realidad no eliminan un archivo hasta que no haya procesos con identificadores abiertos para el archivo. Esto significa que el espacio en disco utilizado por el archivo eliminado no se libera hasta que se cierren todos los identificadores de archivo abiertos. También significa que cualquier proceso con identificadores de archivo abiertos al archivo eliminado puede continuar leyendo y / o escribiendo en el archivo.

El envío de una señal HUP (por ejemplo, a través de pkill -HUP rsyslogo /etc/init.d/rsyslog rotate) a rsyslog le dice que cierre todos sus archivos abiertos, vuelva a cargar su archivo de configuración y vuelva a abrir todos los archivos de registro para escribir (creándolos si es necesario).

Reiniciar rsyslogd también funciona.

Tenga en cuenta que esta es una característica, no un error, con algunas implicaciones útiles, por ejemplo, es por eso que rsyslog sigue escribiendo en el mismo archivo de registro incluso después de que se ha rotado (es decir, renombrado / mv-ed) hasta que rsyslog recibe una señal HUP. Esto significa que las secuencias de comandos y las utilidades de procesamiento de registros no tienen que ser escrupulosamente cuidadosas con respecto al tiempo; solo pueden rotar todos los registros, enviar rsyslog un HUP, y todo continúa funcionando, sin pérdida de datos de registro.

Por cierto, la única forma de que esto no suceda con rsyslog sería si se cierra y se vuelve a abrir cada archivo de registro en cada escritura (o al menos se llama sync()). El rendimiento sería abismal.

cas
fuente
¿Sabe de antemano si un kill -HUP to rsyslog hará que comience a escribir en un nuevo archivo?
slm
quieres decir, si rsyslog.conf ha cambiado y hay un nuevo archivo de registro definido? sí, definitivamente creará y comenzará a escribir en el nuevo archivo al recibir un HUP ... eso es parte del punto de volver a cargar la configuración.
cas
OK, eso es lo que sugerí en mi tercer método, ¡gracias!
slm
el problema se rsyslog se está ejecutando, se elimina un archivo de registro de aplicación (sin reiniciar rsyslog) y luego no más de traza se registrará como rsyslog no va a crear el archivo de registro si no existe mientras se está ejecutando ...
fduff
1
Como dije, desde el punto de vista de rsyslog, ese identificador de archivo todavía existe. lo hará sin cierre y vuelva a abrir / volver a crear los archivos de registro hasta que le indique a reiniciando o con una señal HUP. rsyslog hace lo que le dices que haga, no más. lo que es más importante, el problema no está en lo que hace rsyslog, sino en su comprensión del comportamiento de rsyslog y por qué se comporta así.
cas
3

$ FileCreateMode

¿Esta opción no hace lo que quieres, $ FileCreateMode ?

extracto

$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 salida de archivo

De acuerdo con la documentación de rsyslog, el argumento File del File Output Module podría usarse para hacer esto.

extracto del módulo omfile

Archivo

Si el archivo ya existe, se le agregarán datos nuevos. Los datos existentes no se truncan. Si el archivo aún no existe, se crea. Los archivos se mantienen abiertos mientras rsyslogd esté activo. Esto entra en conflicto con la rotación del archivo de registro externo. Para cerrar un archivo después de la rotación, envíe a rsyslogd una señal HUP después de que el archivo se haya girado.

Enviar syslog una señal HUP

Creo que, en última instancia, debe "activar" rsyslog para hacer esto. No creo que sea lo que quieres automáticamente. Por lo tanto, podría darle una señal HUP para activar la recreación del archivo de registro después de que se elimine.

$ sudo pkill -HUP rsyslog

Al hacerlo, se crearon los siguientes mensajes en mi /var/log/messagesarchivo de registro:

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
fuente
No, lo he usado para establecer permisos de archivo y eso funciona bien. El problema es que si se ha eliminado el archivo de registro, syslog no intentará crearlo antes de registrar el mensaje.
fduff
¿Se ha eliminado y el servidor no se ha reiniciado?
slm
exactamente. Estoy haciendo algunas pruebas y me encontré con esta particularidad ...
fduff
@fduff - mira mis actualizaciones, ¡prueba la tercera!
slm