写在前面
在前面一篇文章中,我们介绍了如何在linux上搭建logstash+kafka的环境(logstash+kafka),在这篇中将介绍如何连通java日志文件和logstash。
日志分类
一般在java开发过程中最常用到的两种日志工具:
- log4j : Apache的开源项目
- logback : 可以说是log4j的改良版,和上者同一个作者
下面我们分别介绍这两种日志工具如何来和logstash连通,实现日志的收集。
log4j
log4j相对来说比较简单,它可以有两种配置方式:properties文件和xml文件
- properties格式
log4j.rootLogger=DEBUG, logstash
##SocketAppender
log4j.appender.logstash=org.apache.log4j.net.SocketAppender
##logstash等待接收的端口
log4j.appender.logstash.Port=4560
##logstash服务所在机器的ip
log4j.appender.logstash.RemoteHost=logstash_hostname
log4j.appender.logstash.ReconnectionDelay=60000
log4j.appender.logstash.LocationInfo=true
##日志准入级别
log4j.appender.logstash.Threshold=DEBUG
- xml格式
新增一个appender:
<appender name="LOGSTASH" class="org.apache.log4j.net.SocketAppender">
##logstash服务器IP
<param name="RemoteHost" value="logstash_hostname" />
<param name="ReconnectionDelay" value="60000" />
<param name="LocationInfo" value="true" />
##日志准入等级
<param name="Threshold" value="DEBUG" />
</appender>
加入需要监控的logger中
<logger name="com.springapp.mvc" additivity="false">
<level class="org.apache.log4j.Level" value="debug"/>
<appender-ref ref="LOGSTASH"/>
<appender-ref ref="LOGFILE"/>
</logger>
对应的logstash的conf文件中的input配置如下:
input {
log4j {
type => "log4j-json"
port => 4560
}
}
log4j产生json格式的数据,格式如下:
{
"message" => "Sorry, something wrong!",
"@version" => "1",
"@timestamp" => "2015-07-02T13:24:45.727Z",
"type" => "log4j-json",
"host" => "127.0.0.1:52420",
"path" => "HelloExample",
"priority" => "ERROR",
"logger_name" => "HelloExample",
"thread" => "main",
"class" => "HelloExample",
"file" => "HelloExample.java:9",
"method" => "main",
"stack_trace" => "java.lang.ArithmeticException: / by zero\n\tat HelloExample.divide(HelloExample.java:13)\n\tat HelloExample.main(HelloExample.java:7)"
}
只需要在日志配置文件中加入对应的appender即可,是不是so easy~
logback
logback相对比较复杂,我们需要用到git上的一个开源项目logstash-logback-encoder 来进行日志的输出,首先我们引入maven依赖:
<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
<version>4.7</version>
</dependency>
还要保证我们的项目中有如下的依赖:
- jackson-databind / jackson-core / jackson-annotations
- logback-core
- logback-classic (required for logging LoggingEvents)
- logback-access (required for logging AccessEvents)
- slf4j-api
在logback.xml文件中添加一个appender:
<appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<destination>192.168.1.193:9250</destination>
<!-- encoder必须配置,有多种可选 -->
<encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder" />
</appender>
加入到需要监控的logger中:
<logger name="com.allinpay" level="ERROR">
<appender-ref ref="LOGSTASH"/>
</logger>
logstash-logback-encoder 中还提供很多种协议,多种encoder,以及多目标配置等等功能,有需要的可以自己学习README。
在logstash配置文件可以有多种交互方式,这里我们选择tcp协议:
input {
tcp {
##host:port即为上面appender中的destination
host => "192.168.1.193"
port => 9250
##模式选择server模式
mode => "server"
tags => ["tags"]
##格式json
codec => json_lines
}
}
按照上面的配置,输入的日志如下:
{
"@timestamp" => "2016-09-13T07:05:06.480Z",
"@version" => 1,
"message" => "HelloController exception",
"logger_name" => "com.springapp.mvc.HelloController",
"thread_name" => "http-bio-8080-exec-1",
"level" => "ERROR",
"level_value" => 40000,
"stack_trace" => "java.lang.ArithmeticException: / by zero",
"HOSTNAME" => "gejunqingdeMacBook-Pro.local",
"host" => "192.168.1.192",
"port" => 57635,
"tags" => [
[0] "tags"
]
}
配置和log4j相似,只是需要引入额外的jar包,所以繁琐一点。
小结
至此,我们已经实现了log-->logstash-->kafka的配置,再加上邮件功能,我们的日志监控发邮件的系统就完成啦。