syslog常被称为系统日志或系统记录,在Unix类操作系统上,syslog日志消息既可以记录在本地文件中,也可以通过网络发送到接收syslog的服务器中。接收syslog的服务器可以将来自许多不同类型系统的日志记录进行统一的管理和存储,或者解析其中的内容做相应的处理,常见的应用场景是网络管理工具、安全管理系统、日志审计系统等。
syslog协议可以理解成多个设备将自身syslog消息发送到统一的syslog服务器时所要遵守的标准。syslog协议是一种主从式协议,分为客户端和服务器端,客户端是产生日志消息的一方,而服务器端负责接收客户端发送来的日志消息,保存到特定的日志文件中或者进行其他方式的处理。
本文主要介绍在实际项目中,如何利用java语言通过syslog的UDP协议将我方日志发送给第三方,包括可能出现的问题及对应的解决方法,以及如何在windows本机电脑和Linux服务器上测试日志发送结果。
Java的maven仓库中有提供了两个syslog依赖供用户使用,分别是:org.graylog2和org.syslog4j,本文中使用的是第一个,在pom文件中引入该依赖。
<dependency> <groupId>org.graylog2</groupId> <artifactId>syslog4j</artifactId> <version>0.9.60</version> </dependency>
引入依赖后,通过Syslog.getInstance()可以获取一个SyslogIF对象,该对象封装了一个log()方法,可将一条封装好的日志信息message发送过去。具体代码如下所示。
对应的配置文件如下所示:
几点说明:
1、其中ip和端口必须设置,其他的可以使用默认配置
2、setMaxMessageLength()用来设置一次发送的日志报文最大长度,需要根据报文中传输的具体数据长度而进行修改,如果报文过长,但是setMaxMessageLength的值设置的太小,报文就会被截断,导致发送不完整的情况。
解决办法是:① 按照1024的倍数调大该值即可;②使用URLDecoder.decode(message,"utf-8")将日志格式转为UTF-8后再发送,防止报文中存在中文出现乱码;③ 以上两种情况都不能解决报文被截断的问题时,需要考虑是否是服务端设置了发送的长度限制,如果是的话,此时需要修改服务端的配置。(修改方法见第三节)
3、syslogIF.log(0, URLDecoder.decode(message,"utf-8"))中第一个Integer类型的参数表示的是日志级别,范围为0~7的数字编号,表示事件的严重程度,0最高,7最低。Syslog为每个事件赋予的优先级如下表所示。
LOG_EMERG | 紧急情况,需要立即通知技术人 |
LOG_ALERT | 应该被立即改正的问题,如系统数据库被破坏,ISP连接丢失 |
LOG_CRIT | 重要情况,如硬盘错误,备用连接丢失 |
LOG_ERR | 错误,不是非常紧急,在一定时间内修复即可 |
LOG_WARNING | 警告信息,不是错误,比如系统磁盘使用了85%等 |
LOG_NOTICE | 不是错误情况,也不需要立即处理 |
LOG_INFO | 情报信息,正常的系统消息,比如骚扰报告,带宽数据等,不需要处理 |
LOG_DEBUG | 包含详细的开发情报的信息,通常只在调试一个程序时使用 |
第二点报文发送不完整的解决办法有以下几种:① 按照1024的倍数调大该值即可;②使用URLDecoder.decode(message,"utf-8")将日志格式转为UTF-8后再发送,防止报文中存在中文出现乱码;③ 以上两种情况都不能解决报文被截断的问题时,需要考虑是否是服务端设置了发送的长度限制,如果是的话,此时需要修改服务端的配置。(修改方法见第三节)
三、测试环境搭建
1、Windows本机电脑
使用Syslog Watch可视化工具查看,下载并安装syslog watch工具,可在https://syslogwatcher.com中下载,或者直接从我上传的资源里直接下载,链接是:https://download.csdn.net/download/weixin_42556307/88915918
打开压缩包,双击打开syslog watch,第一次使用时打开后需要进行配置。
点击Settings,选择Network,将网络传输打开,可以看到UDP协议下默认使用的是514端口,TCP协议下默认使用的是1468端口。
配置好后,点击Listen打开日志监听。
将syslog服务端的ip配置成自己本机的ip(比如我这里的是10.194.97.54),启动项目,可以看到已经监听到代码中发送过来的日志。
其中Reveived表示日志接收时间,SourceIP表示日志来源(因为项目是本地启动,所以日志发送方也是本机ip),Source Name表示来源名称,实际的日志报文在Message里,这里发送的报文格式是key=value格式。通过Syslog Watch工具可以直观明了的看到日志的相关信息,也可用于程序员自测代码。
2、Linux服务器
syslog是Linux系统默认的日志守护进程,一般Linux服务器都安装了syslog,只不过没有使用而已,因此首先需要修改syslog的配置。默认的主配置文件和辅助配置文件分别是:/etc/rsyslog.conf和/etc/sysconfig/syslog。比如我们使用A服务器的syslog。
步骤1——修改配置
首先用xshell连接A服务器,登录root用户,修改/etc/rsyslog.conf,开启UDP接收日志。
在UDP的下面是开启TCP协议的,$UDPServerRun 参数用来配置协议端口,一般都默认514,无需修改。
接着需要修改日志存放位置,由于服务器的日志默认是存放在本地的,如果某个系统管理员管理着几十甚至上百台服务器的时候,默认日志放在每台服务器的本地,当我们每天要去看日志的时候需要一台一台的看很不方便,因此通过修改日志存放位置,可以将多台主机和网络设备等等的日志存到同一个日志服务器上,大大减少了管理员的工作量。修改方式如下,只需要将remote-host改成日志想要存放的ip地址即可。(如果是本服务器查看,则无需修改,比如本文中设置的日志保存ip也是A服务器,其实无需修改,只供参考)
前面我们提到过客户端日志发送截断问题,需要修改服务端MaxMessageSize值,只需修改$MaxMessageSize参数的值即可,如果没有这个参数则新增这个配置。所有配置完成后保存并退出。
步骤2——重启syslog
配置文件修改后,需重复syslog服务才可生效,进入/var/log目录下,使用sudo systemctl restart rsyslog 或 sudo service rsyslog restart 重启服务。
重启完成后,使用sudo netstat -tulpn | grep rsyslog 查看服务运行情况,可以看到此处开启的UDP协议接收日志。
步骤3——查看日志
一般日志存在在/var/log目录下,进入log目录下,将程序中的syslog.ip修改成成A服务器,重启项目,可以看到接收到的日志。每个Message头部会显示客户端ip和时间,正文部分显示接收到的实际日志报文。
四、总结
本文介绍了基于java实现syslog协议发送日志的过程,同时介绍了两种日志测试及查看方式,可以用于与第三方对接时,自测代码。同时当我们需要接收第三方发送的日志时,也可以用相同的方式查看日志内容。