前言
当时接到要开发syslog功能时,我的表情是这样的
…
啥是syslog啊?我没有听说过啊?这东西有什么用啊?懵逼三连
…
然后问问我大佬,他说道syslog就是巴拉巴拉的说了一大堆,我全程嗯嗯啊啊的点头,然后大佬说完了问我听懂了吗?我回复听懂了其实我是这个样子的
我就听懂三点,第一要用java去开发,第二能支持TCP和UDP两种协议,还有可操控的,就这三点于是我开始了设计和研究啥是syslog日志服务器。
前期准备
这里写着需要准备的东西:
- 一双健全的手 ,能动就行;
- 编译器,ecplise或者idea都可以,我这里用的是ecplise;
- syslog解析jar包 这里用的是syslog4j的jar包,mvn项目的话maven地址 maven地址 提取码 mve8 jar地址
注意: 假如你本地maven项目引用的镜像是阿里云你可以将版本改为0.9.46,就像我这里

4.你要懂得syslog是什么,传送门
功能效果图
TCP服务器和TCP客户端运行结果:

TCP服务器和TCP客户端运行结果:

运用到项目里的结果:

操作页面:

接收到的数据只能输出到控制台的问题解决方法
这个问题困扰了我很久也一直百度但是没有找到任何的解决方法,在https://bbs.csdn.net/topics/392090474里有描述,可以复制一楼的代码运行试一试就知道了。主要问题是在于这个jar包的作者没有写出数据处理得方法,而该方法里的run里直接将信息给打印出来,不给一丝操作的机会。解决办法就是实现jar包里的SyslogServerSessionEventHandlerIF接口,然后去重写里面的event方法来达到的。该接口里提供了很多的方法,可以按照自己的需要去重写里面的方法来达到更好的效果。
具体代码
哔哔了这么久开始上代码
1.SyslogServerEventHandler类,为操作接收信息的类,继承SyslogServerSessionEventHandlerIF并重写event方法来达到。
public class SyslogServerEventHandler implements SyslogServerSessionEventHandlerIF {
//extends PrintStreamSyslogServerEventHandler {
private String syslog ;
//重写event方法
public void event(Object session, SyslogServerIF syslogServer, SocketAddress socketAddress, SyslogServerEventIF event) {
//判断传输时间是否存在,不存在将现在的时间设置为传输时间
String date = (event.getDate() == null ? new Date() : event.getDate()).toString();
//将解析日志的生成端,<<3是要该数左移动三位计算
String facility = SyslogUtility.getFacilityString(event.getFacility()<<3);
//讲解析日志的级别,级别越大越低
String level = SyslogUtility.getLevelString(event.getLevel());
//获取当前的源设备IP
String sourceIP = getIPAddress(socketAddress.toString());
//获取到信息主体
String msg = event.getMessage();
//放入信息
setSyslog("{" + facility + "} " + date + " " + level + " " + event.getMessage()+ " " +sourceIP );
try {
//打印信息
System.out.println(getSyslog());
} catch (UnsupportedEncodingException e) {
System.err.println("UnsupportedEncodingException");
}
}
public String getSyslog(

最低0.47元/天 解锁文章
769

被折叠的 条评论
为什么被折叠?



