2016-06-09 4 views
0

여러 컴퓨터 및 여러 웹 응용 프로그램에서 로그 이벤트를 수신하도록 소켓 서버를 설정했습니다. 어떻게하면 각 이벤트를 보내는 클라이언트의 이름을 검색 할 수 있습니까? 아니면이 프레임 워크에서 로그를 분리하는 모범 사례에 전적으로 근거하지 않습니까?소켓 서버 - Log4j2.xml에서 클라이언트 이름을 얻으려면 어떻게해야합니까?


예상 결과 : 따라 해당 파일에 인바운드 로그 이벤트 및 경로를의 클라이언트 이름을 식별 할 수있는 Log4j2 라우팅 펜더와 소켓 서버입니다.

검색 결과 : 라우터가 없으면 모든 로그 이벤트가 모든 파일에 중복 기록됩니다. 라우터에서는 정확한 조회를 모르기 때문에 어떤 파일에도 이벤트가 기록되지 않습니다.


하나의 클라이언트의 설정의

수정 된 버전 :

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

그리고 서버 : SocketAppender는 보낸 사람의 호스트 이름을 포함하지 않는 기본 구성에서

<?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 '클라이언트 이름'. – EJP

+0

@EJP는 발신자의 호스트 이름과 같습니다. – Arc

답변

2

. 그러나 다음을 수행하면 쉽게이 작업을 수행 할 수 있습니다.

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

완벽한, 고마워요! 하지만 어떻게 소켓 서버의 구성에서 속성을 검색합니까? 스레드 컨텍스트 맵에 있습니까? – Arc

+0

- 업데이트 : 신경 쓰지 마세요! 실제로 컨텍스트 맵에 있습니다. 구문이 잘못되었습니다. $$ {ctx : hostName}이거나 속성 이름이 무엇이든합니다. – Arc