2013-11-01 7 views
1

syslog4J에 구현 된 syslog 서버로 들어오는 syslog 메시지를 구문 분석하려고합니다. syslog4J에서이 작업을 수행 할 수 있습니까?syslog4j syslog 서버에서 syslog 메시지를 구문 분석하는 방법

내가하고 싶은 일은 호스트 이름, 타임 스탬프, 메시지, 심각도 수준 등과 같은 syslog 메시지의 다양한 필드를 분리하고 향후 분석을 위해 균일 한 syslog 패턴을 만들 수 있다는 것입니다.

이 기능의 왕은 rsyslog 또는 syslogNG에서 사용할 수 있습니다.

SyslogServerConfigIF config = new TCPNetSyslogServerConfig("0.0.0.0", 1455); 
config.setUseStructuredData(true); 

SyslogServerIF syslogserver = SyslogServer.getInstance("tcp"); 
syslogserver.initialize("tcp", config); 
syslogserver.run(); 

답변

1

새 이벤트 처리기 클래스를 만들어서 메시지를 처리하는 것으로 시작하십시오. 구문 분석은 각 syslog 이벤트에 대해 호출되는 event() 메소드에서 수행되어야합니다.

eventHandler = new SyslogMessageHandler(); config.addEventHandler(eventHandler);

는 그런 다음 테스트를 시작할 준비가 당신을 당신의 다양한 형식과 패턴 :

+0

을 디버깅 할 수 있습니다 :

public class SyslogMessageHandler implements SyslogServerSessionEventHandlerIF { @Override public void event(Object session, SyslogServerIF syslogServer, SocketAddress socketAddress, SyslogServerEventIF event) { // Simple parsing for Strings in the message if (!event.getMessage().contains(" msg=\"")) { Logger.getLogger(getClass().getSimpleName()).log(Level.INFO, event.getMessage()); } // You can also build Objects and/or use Pattern/Matcher for parsing. MyHTTPLogInfo info = new MyHTTPLogInfo(event.getMessage()); Pattern myPattern = Pattern.compile("^GET\\s+/([^\\s\\?]*)(\\?\\S*)?\\s+HTTP/1\\.\\d$"); Matcher matcher = myPattern.matcher(info.getHttpRequest()); if (matcher.matches()) { Logger.getLogger(getClass().getSimpleName()).log(Level.INFO, info.getMyCustomLogOutput()); } } @Override public void exception(Object session, SyslogServerIF syslogServer, SocketAddress socketAddress, Exception exception) { Logger.getLogger(getClass().getSimpleName()).log(Level.INFO, "exception()"); } @Override public Object sessionOpened(SyslogServerIF syslogServer, SocketAddress socketAddress) { Logger.getLogger(getClass().getSimpleName()).log(Level.INFO, "sessionOpened()"); return new Date(); } @Override public void sessionClosed(Object session, SyslogServerIF syslogServer, SocketAddress socketAddress, boolean timeout) { Logger.getLogger(getClass().getSimpleName()).log(Level.INFO, "sessionClosed() {0}", session); } @Override public void initialize(SyslogServerIF syslogServer) { Logger.getLogger(getClass().getSimpleName()).log(Level.INFO, "initialize()"); } @Override public void destroy(SyslogServerIF syslogServer) { Logger.getLogger(getClass().getSimpleName()).log(Level.INFO, "destroy()"); } 

마지막으로 syslog4j의 설정에 이벤트 핸들러로하는 새로운 클래스를 등록 작동시키기 위해 가져올 패키지를 알려주십시오. – Ibrahim

관련 문제