rsyslog no escribe el archivo de registro dinámico

rsyslog no escribe el archivo de registro dinámico

Los archivos de la unidad systemd para mis aplicaciones Java (en Ubuntu 18.04) parecen estar funcionando: había configurado stdout y stderr para que se enviaran a syslog y las entradas del registro aparecían en /var/log/syslog.

Sin embargo, quiero usar nombres dinámicos, por eso agregué /etc/rsyslog.d/10-myapp.conf que contiene:

$CreateDirs on

:programname, startswith, "myapp-" {
  /var/log/apps/$programname.log
  stop
}

Luego reinicié rsyslog... y obtuve un archivo llamado $programname.log en el directorio.

Sospecho que puede haber un problema con la forma en que especifiqué el nombre del archivo dinámico; veo en otros lugares personas que usan unsintaxis diferente para seleccionarel mensaje junto con %...% alrededor del nombre de la variable. Sin embargo, intentar lo siguiente (y reiniciar rsyslog) no ayudó:

:programname, startswith, "myapp-" {
  "/var/log/apps/%programname%.log"
  stop
}

Eso me dio un archivo llamado %programname%.log

Respuesta1

Para utilizar nombres de archivos dinámicos, debe utilizar una plantilla. Esto nombra la cadena (generalmente DynFileen ejemplos) e interpolará los %property%valores en la cadena cuando se use. Para utilizar la plantilla en la sintaxis heredada, debe anteponerle el prefijo ?.Intente

$template DynFile,"/var/log/apps/%programname%.log"
:programname, startswith, "myapp-" {
  ?DynFile
  stop
}

La sintaxis no heredada es un poco más explícita y, en ocasiones, puede ser más legible. En realidad estás usando el incorporadoarchivo ommódulo. Tener cuidado,plantillastienen 2 usos diferentes: como nombres de archivos dinámicos y como formato para escribir los datos. Sin embargo, para cadenas simples, se definen de la misma manera, por ejemplo:

template(name="myfile" type="string"
     string="/var/log/apps/%programname%.log")

if ($programname startswith "myapp-") then {
     action(type="omfile" dynaFile="myfile")
     stop
}

Las palabras clave como dynaFiledeben escribirse exactamente. Tenga en cuenta que action()tiene una template=...opción de palabra clave. Esto es para proporcionar una plantilla para los datos escritos en el archivo.

información relacionada