2016-06-09 7 views
0

Ich habe einen Socket-Server eingerichtet, um Protokollereignisse von mehreren Computern und mehreren Webanwendungen zu empfangen. Wie kann ich den Namen des Clients (vorzugsweise in der XML-Konfiguration) abrufen, der jedes Ereignis sendet? Oder bin ich völlig unabhängig von der Best Practice für die Trennung von Protokollen in diesem Framework?Socket Server - Wie kann ich den Namen des Clients in Log4j2.xml abrufen?


Erwartetes Ergebnis: ein Socket-Server mit einem appender Log4j2 Routing, die den Client-Namen der eingehenden Protokollereignisse ab und leiten diese an die entsprechende Datei entsprechend identifizieren können.

Ergebnis Ich bekomme: Ohne den Router schreibt es alle Log-Ereignisse redundant in alle Dateien. Da ich den Router nicht kenne, werden keine Ereignisse in einer Datei protokolliert.


Modifizierte Version eines Clients config:

<?xml version="1.0" encoding="UTF-8"?> 
<Configuration status="trace"> 
    <Appenders> 

     <Socket 
      name="Socket" 
      host="log4j-srv" 
      port="1234" 
     > 
      <SerializedLayout /> 
     </Socket> 
    </Appenders> 
    <Loggers> 
     <Root level="trace"> 
      <AppenderRef ref="Socket"/> 
     </Root> 
    </Loggers> 
</Configuration> 

Und der Server:

<?xml version="1.0" encoding="UTF-8"?> 
    <Configuration status="trace"> 
     <Appenders> 
      <Routing name="Routing"> 
       <Routes pattern="???"> 
        <Route> 
         <RollingRandomAccessFile name="Default" 
               fileName="example1.log" 
               example-%d{yyyy-MM-dd}.log"> 
          <PatternLayout pattern="${hostName} %d{HH:mm:ss} [%t] %-5level %logger{36} - %msg%n"/> 
          <Policies> 
           <TimeBasedTriggeringPolicy/> 
          </Policies> 
          <DefaultRolloverStrategy max="10"/> 
         </RollingRandomAccessFile> 
        </Route> 
        <Route key="client1"> 
         <RollingRandomAccessFile name="Client1" 
               fileName="otherexample.log" 
filePattern="otherexample-%d{yyyy-MM-dd}.log"> 
          <PatternLayout pattern="${hostName} %d{HH:mm:ss} [%t] %-5level %logger{36} - %msg%n"/> 
          <Policies> 
           <TimeBasedTriggeringPolicy/> 
          </Policies> 
          <DefaultRolloverStrategy max="10"/> 
         </RollingRandomAccessFile> 
        </Route> 
       </Routes> 
      </Routing> 
     </Appenders> 
     <Loggers> 
      <Root level="info"> 
       <AppenderRef ref="Routing"/> 
      </Root> 
     </Loggers> 
    </Configuration> 
+0

Defne 'Name des Clients'. – EJP

+0

@EJP wie im Hostnamen des Absenders. – Arc

Antwort

2

In der Standardkonfiguration der SocketAppender nicht den Host-Namen des Absenders enthält. Sie können dies jedoch leicht tun:

<Logger name="com.acme" level="debug" additivity="false"> 
    <Property name="hostName">$${hostName}</Property> 
    <AppenderRef ref="socket"/> 
</Logger> 
+0

Perfekt, danke! Aber wie kann ich eine Eigenschaft in der Socket Server-Konfiguration abrufen? Ist es in der Thread-Kontext-Map? – Arc

+0

- Update: Macht nichts! Es ist tatsächlich in der Kontextkarte, ich hatte gerade die Syntax falsch. Sollte $$ {ctx: hostName} oder was auch immer der Name der Eigenschaft sein. – Arc

Verwandte Themen