Log4j插件可以通过log4j.jar获取Java日志,搭配Log4j的SocketAppender和SocketHubAppender使用,常用于简单的集群日志汇总。
最小化的配置
input {
log4j {
host=>"localhost"
port=>4560
}
}
output {
stdout {}
}
log4j插件配置host以及port就能监听localhost上的4560端口的log4j消息。
此时,如果你的log4j向本地主机以SocketAppender的方式输出日志消息,Logstash就能捕获到,参考的log4j配置文件如下:
xml version="1.0" encoding= "UTF-8" ?>
DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j=" http://jakarta.apache.org/log4j/" >
<appender name="ConsoleAppender" class="org.apache.log4j.ConsoleAppender" >
<layout class="org.apache.log4j.PatternLayout" >
<param name="ConversionPattern" value="%d{yyyy/MM/dd-HH:mm:ss} >> %5p >> %t >> %l >> %m%n" />
layout>
appender>
<appender name="socketAppender" class="org.apache.log4j.net.SocketAppender">
<param name="remoteHost" value="localhost" />
<param name="port" value="4560" />
<param name="Threshold" value="INFO" />
<param name="ReconnectionDelay" value="1000" />
<param name="LocationInfo" value="true" />
appender>
<root>
<priority value="info" />
<appender-ref ref="ConsoleAppender" />
<appender-ref ref="sockethubAppender" />
root>
log4j:configuration>
重要参数详解
mode logstash工作模式,可选"server"或者"client",默认是"server"
server就是把logstash看做是日志的服务器,接收log4j主机端生成的日志消息。
client则是把logstash看做是tcp的发起者,请求log4j主机返回日志消息。
host 主机地址,字符串类型,如"localhost"或者"192.168.0.1"
如果是server模式,就是监听的主机地址
如果是client模式,就是连接的目标地址
port 端口号,数字类型,如 4567 或者 12345
如果是server模式,就是监听的端口号
如果是client模式,就是连接的目标端口号
data_timeout 超时时间,秒为单位。如果设置-1,则永不超时,默认是5
如果某个tcp连接闲置了,则超过该时间限制,就断开或者关闭连接。
Server模式
server模式就是把logstash作为服务器,输出日志消息的java程序所在的主机作为客户机,大致类似如下:
Logstash的插件配置如下:
input{
log4j {
mode => "server"
host => "localhost"#注意这里,这里是Logstash服务器的地址或者主机名
port => 4560
}
}
output{
stdout{}
}
java程序log4j日志配置文件如下:
xml version="1.0" encoding= "UTF-8" ?>
DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" >
<appender name="ConsoleAppender" class="org.apache.log4j.ConsoleAppender" >
<layout class="org.apache.log4j.PatternLayout" >
<param name="ConversionPattern" value="%d{yyyy/MM/dd-HH:mm:ss} >> %5p >> %t >> %l >> %m%n" />
layout>
appender>
<appender name="socketAppender" class="org.apache.log4j.net.SocketAppender">
<param name="remoteHost" value="localhost" />
<param name="port" value="4560" />
<param name="Threshold" value="DEBUG" />
<param name="ReconnectionDelay" value="60000" />
<param name="LocationInfo" value="true" />
appender>
<root>
<priority value="debug" />
<appender-ref ref="ConsoleAppender" />
<appender-ref ref="socketAppender" />
root>
log4j:configuration>
Client模式
client模式就是把Logstash当做客户端,去请求返回java程序所在的主机输出的日志,大致如下:
logstash的配置如下:
input{
log4j {
mode => "client"
host => "10.4.5.6"
port => 9999
}
}
output{
stdout{}
}
java程序这端的log4j配置文件如下:
xml version="1.0" encoding= "UTF-8" ?>
DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j=" http://jakarta.apache.org/log4j/" >
<appender name="ConsoleAppender" class="org.apache.log4j.ConsoleAppender" >
<layout class="org.apache.log4j.PatternLayout" >
<param name="ConversionPattern" value="%d{yyyy/MM/dd-HH:mm:ss} >> %5p >> %t >> %l >> %m%n" />
layout>
appender>
<appender name="sockethubAppender" class="org.apache.log4j.net.SocketHubAppender">
<param name="port" value="9999" />
<param name="Threshold" value="INFO" />
<param name="LocationInfo" value="true" />
appender>
<root>
<priority value="info" />
<appender-ref ref="ConsoleAppender" />
<appender-ref ref="sockethubAppender" />
root>
log4j:configuration>
扩展
其实从logstash源码的角度看,就比较好理解他们的不同工作了!
可以看到,如果是server模式,logstash会创建一个新的线程,持续的监听目标主机和端口;如果是client模式,则是创建了一个tcp连接。
对应来说,server模式对应log4j的SocketAppender模式,client模式对应log4j的SocketHubAppender模式。
关于Log4j插件大致的内容就是如此了。
参考
【1】logstash log4j插件:https://www.elastic.co/guide/en/logstash/current/plugins-inputs-log4j.html
【2】log4j SocketAppender:http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/net/SocketAppender.html
【3】log4j SocketHubAppender:http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/net/SocketHubAppender.html
[logstash-input-log4j]插件使用详解