web-dev-qa-db-fra.com

log4j2 - Syslog appender et PatternLayout

Je dois enregistrer les événements dans le syslog. J'utilise lo4j2 et l'appendeur syslog. Mon bloc des appenders dans log4j2.xml ressemble à ceci:

<appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
        </Console>
        <Syslog name="syslog" Host="localhost" port="514" protocol="UDP" charset="ISO-8859-1">
        </Syslog>
        <RollingFile name="AppLog" fileName="/var/log/app.log"
                     filePattern="/var/log/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log.gz">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
            <Policies>
                <TimeBasedTriggeringPolicy/>
            </Policies>
        </RollingFile>          
    </appenders>

Comme vous pouvez le voir, j'ai un appender Console et un appender RollingFile avec un PatternLayout spécifique. Je souhaite utiliser le même PatternLayout pour l'appendeur Syslog. Cependant, les messages de journal dans le syslog semblent toujours utiliser une disposition prédéfinie. J'ai essayé de faire ce qui suit:

<Syslog name="syslog" Host="localhost" port="514" protocol="UDP" charset="ISO-8859-1">
    <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Syslog>

Mais cela n'a aucun effet. les messages syslog ont toujours le même format prédéfini.

Comment puis-je déterminer le format de mes messages de journal qui vont dans le syslog?

14
Doron Gold

Comme mentionné dans ce rapport de bogue log4j2 , les développeurs de log4j2 ont codé le SyslogAppender en tant que SocketAppender hardwired à un SyslogLayout

car il est conçu pour être conforme au format Syslog d'origine ou à la RFC 5424. Aucune autre mise en page ne doit être autorisée.

Malheureusement, ils ne se sont pas rendus compte que les spécifications RFC 5424 n’imposent aucun format particulier pour le message contenu dans le journal, mais que dans l’implémentation Log4j2, il ne s’agit que de la partie %m du journal.

Pour résoudre ce problème, une solution (suggérée dans le même rapport de bogue) consiste à reproduire le format syslog à l'aide de PatternLayout à l'intérieur d'un SocketAppender, comme suit.

<Socket name="SYSLOG" Host="localhost" port="514" protocol="UDP">
  <PatternLayout
    pattern="&lt;1&gt;%d{MMM dd HH:mm:ss} ${hostName} appName: {
      &quot;Host&quot;:&quot;${hostName}&quot;,
      &quot;thread&quot;:&quot;%t&quot;,
      &quot;level&quot;:&quot;%p&quot;,
      &quot;logger&quot;:&quot;%c{1}&quot;,
      &quot;line&quot;:%L,
      &quot;message&quot;:&quot;%enc{%m}&quot;,
      &quot;exception&quot;:&quot;%exception&quot;
      }%n"
  />
</Socket>

Ceci écrira des journaux RFC5424 bien formatés sur le port 514 local via UDP. Voici un exemple de sortie du journal:

Sep 14 10:40:50 app-hostname app-name: { "Host":"Host-name-01", "thread":"http-nio-8080-exec-4", "level":"DEBUG", "logger":"ExecuteTimeInterceptor", "line":52, "message":"GET &#x2F;health 200 served in 3", "exception":"" }
17
micpalmia

Je ne crois pas que vous puissiez utiliser un modèle sur l'appender Syslog de base. 

D'après la documentation, il est indiqué que 

"SyslogAppender est un SocketAppender qui écrit sa sortie sur une destination distante spécifiée par un hôte et un port dans un format conforme au format BSD Syslog ou à la RFC 5424" http: //logging.Apache. org/log4j/2.x/manual/appenders.html # SyslogAppender

Cependant, cela vous permet de spécifier "format = RFC 5424"

Si vous utilisez RFC 5424

Ensuite, vous pouvez définir un paramètre PatterLayout dans le paramètre loggerFields. Voir http://logging.Apache.org/log4j/2.x/manual/layouts.html#RFC5424Layout

J'espère que cela pourra aider!

7
conornicol

Vous pouvez utiliser SocketAppender et PatternLayout pour formater les messages syslog (syslog-ng).
Pour prendre en charge les sévérités dynamiques avec une installation fixe (par exemple: 'messages de niveau utilisateur' - voir RFC5424 ), le modèle doit ressembler à ceci:

<Socket name="SYSLOG" Host="${env:INTERFACE}" port="514" protocol="UDP">
   <PatternLayout pattern="&lt;%level{TRACE=15, DEBUG=15, INFO=14, WARN=12, ERROR=11, Fatal=11,&gt;%replace{${env:APPLICATION_NAME}}{\r}{}[%X{PID}] %t(%T) %c{10} - %m%n"/>
</Socket>


Pour calculer la valeur de priorité (PRIVAL) des «messages d’information» et des «messages d’information» de la facilité de la facilité - voir RFC5424 ), l’exemple suivant peut vous aider:

Syslog:          Facility  | Severity
Numerical Code:      1          6
Bin:             0 0 0 0 1 |  1 1 0
Dec:                 8     +    6    =  14

log4j2syslog-ngsocketappenderpatternlayout

2
butcher82

Vous pouvez utiliser l'ajout d'éléments supplémentaires à un message SyslogAppender au format RFC5424 à l'aide de la balise LoggerFields, comme suit:

<LoggerFields>
  <KeyValuePair key="thread" value="%t"/>
  <KeyValuePair key="priority" value="%p"/>
  <KeyValuePair key="category" value="%c"/>
  <KeyValuePair key="exception" value="%ex"/>
</LoggerFields>

Je les retire ensuite en utilisant le module d'analyse RFC5424 de rsyslog, mmpstrucdata, pour créer un arbre json. Le modèle rsyslog.conf permettant d’y accéder se présente comme suit:

template(name="jsondump" type="string" string="'%$!rfc5424-sd!mdc@18060!thread%', '%$!rfc5424-sd!mdc@18060!priority%', '%$!rfc5424-sd!mdc@18060!category%', '%$!rfc5424-sd!mdc@18060!exception%'")

J'essayais juste de faire la même chose et je pensais partager ce qui fonctionnait pour moi. - Sam

1
SamBeroz

J'ai utilisé le config posté par butcher82 , mais j'ai du le changer un peu pour produire le résultat dont j'avais besoin. 

Ce que j'ai finalement obtenu est un message avec la priorité correcte, un horodatage (sans zéros pendant des jours), un hôte et une partie du message. Le mappage entre les niveaux syslog et log4J est utilisé comme défini dans org.Apache.log4j.Level et la fonctionnalité est définie sur 1 (messages au niveau utilisateur), afin de simplifier le calcul de la priorité.

Ce modèle devrait être compatible avec la RFC-3164:

<Socket name="SysLogAppender" Host="localhost" port="514" protocol="UDP">
    <PatternLayout pattern="&lt;%level{TRACE=7, DEBUG=7, INFO=6, WARN=4, ERROR=3, Fatal=0}&gt;%d{MMM d hh:mm:ss} ${hostName} %m%n"/>
</Socket>

Ci-dessous la sortie produite:

<3>Dec 15 09:59:16 foo.bar.hostname this is a test message

Remarque: On peut ajouter un nom d'application ou un pid après le nom d'hôte.

0
LeChuck