1、前言
Syslog4j是一个实现Syslog(RFC3164)协议的Java开源类库包括客户端与服务器端。通过 UDP/IP, TCP/IP, TCP/IPover SSL/TLS, Unix Syslog, 和 Unix Socket 等协议进行日志记录。
本文介绍了如何使用Syslog4j作为日志服务端接收Syslog日志。
2、需要的资源
下载地址 :http://syslog4j.org/
需要的jar包:syslog4j-0.9.46.jar
3、示例程序
Syslog4j本身自带了一个服务端的例子程序:SyslogServerMain。这是一个命令行方式的日志服务器的实现。
命令参数说明如下:
SyslogServer [-h<host>] [-p <port>] [-o <file>] [-a] [-q] <protocol>
-h <host> host or IP to bind
-p<port> port to bind
-t<timeout> socket timeout (in milliseconds)
-o<file> file to write entries(overwrites by default)
-a append to file (instead ofoverwrite)
-q do not write anything to standardout
protocol Syslog4j protocol implementation (tcp,udp, ...)
命令执行方法如下:
java -cpsyslog4j-0.9.46.jar org.productivity.java.syslog4j.server.SyslogServerMain -p5555 udp
代表的含义是使用本机的5555端口,通过UDP协议接收日志。
4、程序分析
Syslog4j服务端的入口为SyslogServer。在创建此类时会初始化两个SyslogServer实例:实现UDP协议的服务类(UDPNetSyslogServer)和实现TCP协议的服务类(TCPNetSyslogServer)。这两个具体的协议处理类都共有相同的接口SyslogServerIF。其继承关系如下:
在生成服务类实例时需要两个参数:协议名称和配置类。配置类定义了通讯协议中需要的一些配置项,比如:主机,端口,协议,是否写文件等等。配置类也根据不同的通讯协议分为UDP和TCP两种,共同实现相同的接口SyslogServerConfigIF。其继承关系如下:
![](http://hi.csdn.net/attachment/201111/11/0_132097545309RK.gif)
创建好协议处理类后会注册到SyslogServer的实体池中供使用。
当需要将日志数据写到本地文件时,需要创建一个事件处理器来实现写日志。事件处理器保存到协议处理类的配置项中。
if(options.fileName != null) {
SyslogServerEventHandlerIF eventHandler = newFileSyslogServerEventHandler(options.fileName,options.append);
syslogServerConfig.addEventHandler(eventHandler);
}
事件处理器的作用是对日志内容如何处理比如写到文件中或是输出到屏幕上。事件类SyslogServerEventIF是对接收到的数据进行解析。
以UDP协议为例,Syslog4j处理流程如下:5、总结
Syslog4j实现了Syslog协议可以用来接收syslog日志。目前工程更新比较缓慢,可查阅的资料不多。但好在整体框架比较简单还是很好掌握的。如果做为syslog日志服务器的话在性能方面还需要检验,网上还没看到比较成熟的案例。
6、程序案例
<dependency> <groupId>org.syslog4j</groupId> <artifactId>syslog4j</artifactId> <version>0.9.30</version> </dependency>
发送消息端:
package com.east.spark.syslog; import org.productivity.java.syslog4j.Syslog; import org.productivity.java.syslog4j.SyslogIF; public class Syslog4jDemo { public static void main(String[] args) { // TODO Auto-generated method stub // Set a Specific Host, then Log to It SyslogIF syslog = Syslog.getInstance("udp"); syslog.getConfig().setHost("localhost"); syslog.getConfig().setPort(8088); while (true) { syslog.info("Today is a good day!,liuxiangke"); try { Thread.sleep(2000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }接收端:
package com.east.spark.udp; import java.net.DatagramPacket; import java.net.DatagramSocket; public class UDPServer { public static void main(String[] args) throws Throwable { // TODO Auto-generated method stub DatagramSocket datagramSocket = new DatagramSocket(8088); while (true) { DatagramPacket packet = new DatagramPacket(new byte[512], 512); try { datagramSocket.receive(packet); String msg = new String(packet.getData(), 0, packet.getLength()); System.out.println(packet.getAddress() + "/" + packet.getPort() + ":" + msg); packet.setData("I am server!!!".getBytes()); datagramSocket.send(packet); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }