如何在 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 中解压缩 [关闭]