前段时间看了一篇io对性能的影响的文章,记不起来在哪里看到的了。
里面对我印象比较深的是,硬盘操作(寻道、read、write)消耗的性能很可观。
这里试着把所有的日志通过内网直接输出到专用的一个日志服务器。这样可以避免在游戏服上记录日志,而且也方便统一管理日志。
在网上查找了一下相关文章,log4j2支持将日志写向远程socket或syslog。
如果用socket,还需要自己来写代码接收,所以决定使用syslog。
而且centos6以后都自带rsyslog(syslog的增强版),配置起来也方便。
以下是相关步骤:
rsyslog日志
1、编辑 /etc/rsyslog.conf
注释掉下两句最前面的#,这两句的作用是打开514端口,使用socket来接收日志。
# Provides TCP syslog reception $ModLoad imtcp $InputTCPServerRun 514
修改完后重启 rsyslog
service rsyslog restart
修改防火墙,对内网开放514端口
2、发愁啊,怎么格式化日志。
看来学艺不精,使用log4j2,竟然不知道如何格式化。
现在把log4j2改为logback ( logback的syslogappender使用udp发送,注意把第一步的tcp改为udp)。
以下需要查看rsyslog如何将日志按天进行分割及按来源分别存储在不同的目录下。
syslog可以使用%msg:F:1%来进行匹配fileds,fields中使用’\t’分隔的字符串,分隔符可以自定义。
比如要使用空格为分隔符即为:%msg:F,32:1%
除了使用分隔符rsyslog还支持正则表达式进行匹配,但匹配相对慢一些。
下面我们来看一个具体路由日志的例子:
$template DynFile,"/var/log/router-log/%msg:F,32:3%/%timegenerated:1:10:date-rfc3339%/%msg:F,32:4%" :source , !isequal , "localhost" ?DynFile :source , !isequal , "localhost" ~
以上面的代意思是:
将消息存储在 /var/log/router-log/第二个filed/当前日期(天)/第三个field
这样,我们在定义logback的日志时,使用以下格式:
<appender name="job" class="ch.qos.logback.classic.net.SyslogAppender"> <syslogHost>192.168.17.17</syslogHost> <port>514</port> <suffixPattern>A</suffixPattern> <facility>LOCAL7</facility> <suffixPattern>%date ${MODULE} job.log [%thread] %logger{0}\(%L\) %p %msg </suffixPattern> </appender>
<suffixPattern>中的 ${MODULE}指定存储所在的目录,是从环境变量中获取。
job.log是存储日志的具体文件名。
你可能会问第一个field为什么是日期,我试过了%msg:F,32:1%,但无论如何尝试都无法取到第一个field的内容。只好从第二个field开始取。
当一个临时解决方案吧。
0 条评论。