2017-12-21 34 views
0

그래서 내가 두 클래스 LogSender이 내 구성 파일 또는 log4j2.properties 파일추출 로그 LOGEVENT 개체를 통해 SocketAppender 보내

#Socket Appender 
appender.socket.type=Socket 
appender.socket.name=Socket_Appender 
appender.socket.host=10.176.250.5 
appender.socket.port=9000 
appender.socket.layout.type=SerializedLayout 
appender.socket.connectTimeoutMillis=2000 
appender.socket.reconnectionDelayMillis=1000 
appender.socket.protocol=TCP 
#Loggers 
logger.socket.name=atom 
logger.socket.level=debug 
logger.socket.appenderRefs=socket 
logger.socket.appenderRef.socket.ref=Socket_Appender 

다음과 LogListener

LogSender

그것의 작업 SocketAppender를 통해 로그를 보내는 것입니다.

Stream을 통해 전송되는 내용은 LogEvent 객체입니다.

public class LogSender { 

public static final Logger LOG = LogManager.getLogger("atom"); 

public static void main(String[] args) { 
    LOG.trace("Error 1"); 
    LOG.debug("Error 2"); 
    LOG.info("Error 3"); 
    LOG.warn("Error 4"); 
    LOG.error("Error 5"); 
    LOG.fatal("Error 6"); 
    } 
} 

LogListener은

이것은 스트림을 통해 전송 된 LOGEVENT 개체를받을 예정이다. LogListener는 ObjectInputStream에를 사용하고

LogEvent event = null; 
private Socket socket1 = null; 
private ServerSocket ss = null; 
PrintWriter sspw=null; 
ObjectInputStream objectInputStream = null; 
try { 
//Creating Socket and making it listen to a specific port, receiving through streams. 
//Servers socket creation and waiting 
     ss = new ServerSocket(9000); 
     socket1 = ss.accept(); 

     objectInputStream = new ObjectInputStream(new BufferedInputStream(socket1.getInputStream())); 

     event = (LogEvent) objectInputStream.readObject(); 
     System.out.println(event.getLoggerName()); 
     System.out.println(event.getLevel()); 
     System.out.println(event.getMessage().getFormattedMessage()); 
     objectInputStream.close(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } catch (ClassNotFoundException e) { 
     e.printStackTrace(); 
    } 

출력

원자

DEBUG

오류 2

OUTP을 절약 ut는 예상대로 Logger의 이름입니다. 즉, LogEvent 객체를 수신하고 로거 정보를 추출 할 수 있다는 의미입니다. 또한 실제 로그 메시지를받을 수 있지만 수준 팝업 중 하나, 즉 디버그 수준 만 수신 할 수 있습니다.

다른 모든 수준도 필요합니다. 내가 어떻게하면 좋을까?

저는 Log4j2에 매우 익숙합니다. 나는 이해하기 위해 뭔가를 놓친 것처럼 느낍니다.

답변

1

구성 파일 log4j2.propertieslogger.socket.level=debug이 있지만 수준 추적을 사용하려면 logger.socket.level=trace이 있어야하므로 첫 번째 로그 (TRACE)가 표시되지 않습니다.

다른 로그에 대해서는 루프에서 수신기 코드를 실행해야합니다. 바로 지금 첫 번째 로그 만 읽는 것입니다.

나는이 코드를 테스트하지 않았지만이 같아야합니다 : ** **

LogEvent event = null; 
private Socket socket1 = null; 
private ServerSocket ss = null; 
PrintWriter sspw=null; 
ObjectInputStream objectInputStream = null; 
try { 
     //Creating Socket and making it listen to a specific port, receiving through streams. 
     //Servers socket creation and waiting 
     ss = new ServerSocket(9000); 
     socket1 = ss.accept(); 

     objectInputStream = new ObjectInputStream(new BufferedInputStream(socket1.getInputStream())); 

     while (true) { 
      event = (LogEvent) objectInputStream.readObject(); 
      System.out.println(event.getLoggerName()); 
      System.out.println(event.getLevel()); 
      System.out.println(event.getMessage().getFormattedMessage()); 
     } 
} catch (Exception e) { 
    e.printStackTrace(); 
} finally { 
    if (objectInputStream != null) { 
     objectInputStream.close(); 
    } 
} 
+0

그래서, 네 일했다,하지만 난 방법을 이해하지 않습니다. –

+0

내가 이해가 안되는 EOFException을 얻는다. –

+1

위의 코드에서이 예외가 발생하면 다른 쪽 (로그를 보내는 앱)이 연결을 종료했음을 의미해야한다. 두 당사자 사이). 나는 당신이 다른 루프 안에이 전체 코드를 넣으면 EOFException의 경우에 자동으로/주기적으로 다시 연결할 수 있다고 생각한다. – xav