it-swarm.com.de

log4j2 - Syslog-Appender und PatternLayout

Ich muss Ereignisse im Syslog protokollieren. Ich verwende lo4j2 und den Syslog-Appender. Mein Appenders-Block in log4j2.xml sieht folgendermaßen aus:

<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>

Wie Sie sehen, habe ich einen Console-Appender und einen RollingFile-Appender mit einem bestimmten PatternLayout. Ich möchte das gleiche PatternLayout für den Syslog-Appender verwenden. Die Protokollmeldungen im Syslog scheinen jedoch immer zu sein Verwenden Sie ein vordefiniertes Layout. Ich habe Folgendes versucht:

<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>

Dies hat jedoch keine Wirkung. Die Syslog-Nachrichten haben immer noch dasselbe vordefinierte Format.

Wie kann ich das Format meiner Protokollnachrichten ermitteln, die in das Syslog gehen?

14
Doron Gold

Wie in diesem log4j2-Fehlerbericht erwähnt, codierten die Entwickler von log4j2 den SyslogAppender als SocketAppender mit einem SyslogLayout fest verdrahtet.

da es beabsichtigt ist, entweder dem ursprünglichen Syslog-Format oder RFC 5424 zu entsprechen. Kein anderes Layout sollte zulässig sein.

Leider haben sie nicht erkannt, dass die RFC 5424-Spezifikationen kein bestimmtes Format für die im Protokoll enthaltene Nachricht erzwingen. In der Implementierung von Log4j2 ist dies nur der %m-Teil des Protokolls.

Um dieses Problem zu lösen, besteht eine Lösung (vorgeschlagen in demselben Fehlerbericht) darin, das Syslog-Format mit einem PatternLayout in einem SocketAppender zu reproduzieren, wie dies der Fall ist

<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>

Dadurch werden gut formatierte RFC5424-Protokolle über UDP an den lokalen 514-Port geschrieben. Es folgt eine Beispielprotokollausgabe:

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

Ich glaube nicht, dass Sie ein Muster für den grundlegenden Syslog-Appender verwenden können. 

Aus den Dokumenten heißt es das 

Msgstr "SyslogAppender ist ein SocketAppender, der seine Ausgabe an ein von einem Host angegebenes Remote - Ziel und einen Port in einem Format schreibt, das entweder dem BSD - Syslog - Format oder dem RFC 5424 entspricht" http: //logging.Apache. org/log4j/2.x/manual/appenders.html # SyslogAppender

Sie können jedoch "format = RFC 5424" angeben.

Wenn Sie RFC 5424 verwenden

Dann können Sie ein PatterLayout in den Parameter loggerFields einfügen. Siehe http://logging.Apache.org/log4j/2.x/manual/layouts.html#RFC5424Layout

Hoffentlich hilft das!

7
conornicol

Sie können SocketAppender und PatternLayout verwenden, um Syslog-Nachrichten (Syslog-ng) zu formatieren.
Um dynamische Schweregrade mit einer festen Einrichtung zu unterstützen (z. B. "Meldungen auf Benutzerebene" - siehe RFC5424 ), sollte das Muster folgendermaßen aussehen:

<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>


Zur Berechnung des Prioritätswerts (PRIVAL) für "Benutzerebene" der Einrichtung und "Informationsnachrichten" der Schweregradstufe (siehe RFC5424 ) kann das folgende Beispiel hilfreich sein:

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

log4j2syslog-ngsocketappenderpatternlayout

2
butcher82

Sie können einer RFC5424-formatierten SyslogAppender-Nachricht zusätzliche Elemente hinzufügen, indem Sie das LoggerFields-Tag wie folgt verwenden:

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

Ich ziehe diese dann mit rsyslogs RFC5424-Analysemodul mmpstrucdata heraus, um einen Json-Baum zu erstellen. Die Vorlage "rsyslog.conf" für den Zugriff sieht folgendermaßen aus:

template(name="jsondump" type="string" string="'%[email protected]!thread%', '%[email protected]!priority%', '%[email protected]!category%', '%[email protected]!exception%'")

Ich habe nur versucht, das Gleiche zu tun und dachte, ich würde teilen, was für mich funktioniert. - Sam

1
SamBeroz

Ich habe die config von butcher82 verwendet, musste sie jedoch ein wenig ändern, um das gewünschte Ergebnis zu erzielen. 

Am Ende habe ich eine Nachricht mit der richtigen Priorität, einem Zeitstempel (ohne führende Nullen für Tage), einem Host und einem Nachrichtenteil. Die Zuordnung zwischen syslog und log4J wird wie in org.Apache.log4j.Level definiert und die Einrichtung auf 1 (Meldungen auf Benutzerebene) gesetzt, um die Prioritätsberechnung zu vereinfachen.

Dieses Muster sollte mit RFC-3164 kompatibel sein:

<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>

Unten ist die produzierte Ausgabe:

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

Hinweis: Nach dem Hostnamen kann ein Anwendungsname oder eine PID hinzugefügt werden.

0
LeChuck