log日志发送到远程服务器

前段时间看了一篇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 条评论。

发表评论


注意 - 你可以用以下 HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>