Как разобрать сообщения системного журнала на сервере системного журнала syslog4j
Я хочу проанализировать сообщения системного журнала, поступающие на сервер системного журнала, реализованный в syslog4J. Это можно сделать в syslog4J?
Я хочу разделить различные поля в сообщениях системного журнала, такие как имя хоста, отметка времени, сообщение, уровень серьезности и т. Д., И создать единый шаблон системного журнала для будущего анализа.
Этот король функциональности доступен в 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(), так как он будет вызываться для каждого события системного журнала.
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()");
}
Наконец, зарегистрируйте этот новый класс как Event Handler в конфигурации syslog4j:
eventHandler = new SyslogMessageHandler();
config.addEventHandler(eventHandler);
Тогда вы готовы начать тестирование и отладку различных форматов и шаблонов:)