如何在 syslog4j syslog 服务器中解析 syslog 消息

Posted

技术标签:

【中文标题】如何在 syslog4j syslog 服务器中解析 syslog 消息【英文标题】:How to parse syslog messages in a syslog4j syslog server 【发布时间】:2013-11-01 10:16:33 【问题描述】:

我想解析传入 syslog4J 中实现的 syslog 服务器的 syslog 消息。在 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() 方法中完成,因为它将为每个 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()");

最后将该新类注册为 syslog4j 配置中的 EventHandler:

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

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

【讨论】:

你能告诉我你需要导入哪些包才能让它工作吗?

以上是关于如何在 syslog4j syslog 服务器中解析 syslog 消息的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Java 中压缩 JSON 并在 Javascript 中解压缩 [关闭]

如何在 jax-ws 网络服务中解组 xml 文件

如何在 .NET 中解压缩使用 Lempel-Ziv Haruyasu 算法压缩的字节?

如何在 vSphere 6.x 中解锁并重置 SSO 密码

如何在windows2008建立syslog服务器

如何在windows服务器中使用syslog功能