web-dev-qa-db-ja.com

log4j2-SyslogアペンダーとPatternLayout

イベントをsyslogに記録する必要があります。私はlo4j2とsyslogアペンダーを使用しています。 log4j2.xmlのアペンダーブロックは次のようになります。

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

ご覧のとおり、特定のPatternLayoutを備えたConsoleアペンダーとRollingFileアペンダーがあります。 Syslogアペンダーに同じPatternLayoutを使用したいと思います。ただし、syslogのログメッセージは常に事前定義されたレイアウトを使用しているようです。私は次のことを試みました:

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

しかし、これは何の効果もありません。 Syslogメッセージは、同じ事前定義された形式のままです。

Syslogに送信されるログメッセージの形式を確認するにはどうすればよいですか?

14
Doron Gold

この log4j2バグレポート で述べたように、log4j2の開発者は SyslogAppenderSocketAppender としてコーディングしました SyslogLayout

これは、元のsyslog形式またはRFC5424のいずれかに準拠することを目的としているためです。他のレイアウトは許可されるべきではありません。

残念ながら、RFC 5424仕様では、ログに含まれるメッセージに特定の形式が適用されないことを理解していませんでした。Log4j2実装では%mログの部分。

この問題を解決するための解決策(同じバグレポートで提案されています)は、SocketAppender内で PatternLayout を使用してsyslog形式を再現することです。

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

これにより、適切にフォーマットされたRFC5424ログがUDP経由でローカル514ポートに書き込まれます。以下は、ログ出力のサンプルです。

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

基本的なSyslogアペンダーでパターンを使用できるとは思いません。

ドキュメントからそれは述べています

「SyslogAppenderは、BSD Syslog形式またはRFC 5424のいずれかに準拠した形式で、ホストとポートによって指定されたリモート宛先に出力を書き込むSocketAppenderです」 http://logging.Apache.org/log4j /2.x/manual/appenders.html#SyslogAppender

ただし、「format = RFC5424」を指定することはできます。

RFC5424を使用する場合

次に、PatterLayoutをloggerFieldsパラメーターに配置できます。 http://logging.Apache.org/log4j/2.x/manual/layouts.html#RFC5424Layout を参照してください

お役に立てば幸いです。

7
conornicol

SocketAppenderとPatternLayoutを使用して、syslog(syslog-ng)メッセージをフォーマットできます。
固定ファシリティで動的な重大度をサポートするには(例:「ユーザーレベルのメッセージ」 RFC5424 を参照)、パターンは次のようになります。

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


ファシリティ 'ユーザーレベルメッセージ'および重大度 '情報メッセージ'の優先度値(PRIVAL)を計算するには RFC5424 を参照)次の例が役立つ場合があります。

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

log4j2syslog-ngsocketappenderpatternlayout

2
butcher82

次のようにLoggerFieldsタグを使用して、RFC5424形式のSyslogAppenderメッセージに要素を追加できます。

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

次に、rsyslogのRFC5424解析モジュールmmpstrucdataを使用してこれらを引き出し、jsonツリーを作成します。それらにアクセスするためのrsyslog.confテンプレートは次のようになります。

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%'")

私は同じことをやろうとしていただけで、うまくいったことを共有したいと思いました。 -サム

1
SamBeroz