java 利用syslog4j 实现 syslog客户端发送日志,解决日志过长被截断分批发送以及日志不完整的问题
开发syslog客户端:
方法一,引用org.graylog2:
<dependency>
<groupId>org.graylog2</groupId>
<artifactId>syslog4j</artifactId>
<version>0.9.60</version>
</dependency>
方法二 引用org.syslog4j:
<dependency>
<groupId>org.syslog4j</groupId>
<artifactId>syslog4j</artifactId>
<version>0.9.30</version>
</dependency>
本项目采用的是方法一,引用org.graylog2
代码:
@KafkaListener(topics = “topic”}, groupId = “group”)
public void consumerSignalMessage(String content) {
log.info("syslog消费服务:" + content);
try{
List<SysLogConfig> list = getSysLogConfigs();
for (SysLogConfig sysConfig:list) {
syslogClient.getConfig().setHost(sysConfig.getHostIp());
syslogClient.getConfig().setPort(Integer.parseInt(sysConfig.getHostPort()));
syslogClient.getConfig().setMaxMessageLength(10240);
syslogClient.log(7, content);
}
}catch (Exception e){
log.error("出异常了!");
}
}
解决日志过长被截断分批发送问题:
一开始被截断分批发送,是因为setMaxMessageLength设置的值过小,设为了1024*2,因此当日志长度过长时,就被截断,前后加上了省略号,如下:
于是将setMaxMessageLength改成了1024*10,这次日志没有再被截断分批,但是显示出来的日志还是不完整的如下:

此时在网上查了很多资料,方法很多,如:
1.将日志转为utf-8格式后再发送
syslogClient.log(7, URLDecoder.decode( content, "utf-8"));
2.如果采用的是org.syslog4j,将版本升级至0.9.46
参考:https://blog.csdn.net/daodan988/article/details/78628685
3.中文字符长度问题,计算中文字符并调整长度后再发送等等
参考:syslog4j发送日志有中文会产生截断_se7en_q的博客-CSDN博客
以上方法一一尝试,都没有解决问题,后来突然想起来只修改了客户端的发送长度限制,并没有设置服务端的接收长度限制,问题终于得到解决,解决方法如下:
打开rsyslog配置文件:
vi /etc/rsyslog.conf
找到 #### MODULES #### 下的 $MaxMessageSize 10kb 配置设置单条日志长度,如没有新增该配置

重启rsyslog
systemctl restart rsyslog
此时日志输出完整

注意:此处设置的大小是根据项目需要来设定的,大家可以根据自己的项目需求进行调整
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)