2017-06-08 186 views
0

クラスタ内のエッジノードでLog4J2 TCPSocketServerを実行しています。すべてのデータノードは、エッジノード上のTCPSocketServerにログイベントを送信し、下に示すようにlog4j2.xml構成ファイルを使用してデータノードにローカルにもログを記録します。アプリケーション名はSystemプロパティとして保存され、$ {sys:ABC.appname}を使用してデータノードまたはクライアントのlog4j2.xml設定からアクセスできます。 log4j2.xmlを使用してTCPSocketServerが実行されているエッジノードに同じアプリ名を送信するにはどうすればよいですか。私はlog4j2-server.xmlの同じアプリケーション名を使用して、データノード上でローカルでやっているように、イベントを別々のログファイルに記録します。データ・ノードまたはクライアントからLog4J2:クライアントからサーバーへのTCPSocketServer実装でアプリケーション名を渡す方法

サンプルスニペット - log4j2.xml:

<?xml version="1.0" encoding="UTF-8"?> 
    <Configuration status="warn" name="MyApp" > 
    <Appenders> 
    <Socket name="socket" host="localhost" port="12345" > 
    <SerializedLayout /> 
    </Socket> 
    <File name="MyFile" fileName="/var/log/${sys:ABC.appname}.log" > 
    <PatternLayout> 
    <Pattern>%d{ISO8601} %p %c{1.} [%t] %m%n</Pattern> 
    </PatternLayout> 
    </File> 
    </Appenders> 
    <Loggers> 
    <Root level="debug"> 
    <AppenderRef ref="socket"/> 
    <AppenderRef ref="MyFile"/> 
    </Root> 
    </Loggers> 
    </Configuration> 

エッジノードまたはサーバからのサンプルスニペット - log4j2-server.xmlの

<?xml version="1.0" encoding="UTF-8"?> 
    <Configuration status="WARN"> 
    <Appenders> 
    <File name="MyFile" fileName="/var/log/data/${hostName}-<**This is where I would like to see the appname from data node**>.log" > 
    <PatternLayout> 
    <Pattern>%d{ISO8601} %p %c{1.} [%t] %m%n</Pattern> 
    </PatternLayout> 
    </File> 
    <Async name="AsyncFile"> 
    <AppenderRef ref="MyFile" /> 
    </Async> 
    </Appenders> 
    <Loggers> 
    <Root level="WARN"> 
    <AppenderRef ref="AsyncFile"/> 
    </Root> 
    </Loggers> 
    </Configuration> 

答えて

0

私はこの問題を解決するためにはThreadContextを使用。 Thread Contextをコードベースに追加するのはかなり簡単で、その後はThreadContextに基づいてログイベントを分離するためにRoutingを使います。私は同じことをするこのリンクの例に従ったhttps://logging.apache.org/log4j/2.x/faq.html#separate_log_files

関連する問題