首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在syslog4j系统日志服务器中解析系统日志消息

如何在syslog4j系统日志服务器中解析系统日志消息
EN

Stack Overflow用户
提问于 2013-11-01 18:16:34
回答 1查看 2.5K关注 0票数 1

我想解析传入syslog4J中实现的syslog服务器的syslog消息。在syslog4J中可以做到这一点吗?

我想要做的是能够分离出syslog消息中的各种字段,如主机名、时间戳、消息、严重级别等,并为将来的分析制定一个统一的syslog模式。

这种功能在rsyslog或syslogNG中可用。

代码语言:javascript
复制
SyslogServerConfigIF config = new TCPNetSyslogServerConfig("0.0.0.0", 1455);
config.setUseStructuredData(true);

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

回答 1

Stack Overflow用户

发布于 2014-03-05 23:42:36

首先创建一个新的Event Handler类来处理消息。请注意,解析应该在event()方法中完成,因为将为每个syslog事件调用该方法。

代码语言:javascript
复制
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配置中将新类注册为EventHandler:

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

然后,您就可以开始测试和调试各种格式和模式了:)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19724748

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档