2013-11-01 3 views
1

Я хочу разобрать syslog-сообщения, поступающие на сервер syslog, реализованный в syslog4J. Это можно сделать в syslog4J?Как разобрать сообщения syslog в syslog4j syslog server

Что я хочу сделать, так это иметь возможность выделять различные поля в сообщениях системного журнала, таких как имя хоста, отметка времени, сообщение, уровень серьезности и т. Д. И создавать единый шаблон 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

Начните с создания нового класса обработчика событий для обработки сообщений. Обратите внимание, что разбор должен выполняться в методе event(), поскольку он будет вызываться для каждого события syslog.

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()"); 
} 

Наконец зарегистрировать этот новый класс как EventHandler в syslog4j конфигурации:

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

Тогда вы готовы приступить к тестированию и отладке ваших различных форматов и моделей :)

+0

может вас скажите мне, какие пакеты вам нужно импортировать, чтобы заставить его работать? – Ibrahim

Смежные вопросы