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>
另外需要注意的是,如果使用server模式,監聽的ip地址只能是本機地址,否則無法綁定socket。
例如,我本身的服務器地址是10.4.5.6,那么我要綁定一個遠端機器,10.4.5.7,就會報如下錯誤:
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模式。
注意:
1 如果是server模式,那么監聽的主機地址應該是IP地址,寫localhost會導致無法接收其他主機發送的信息。
2 如果是client模式,監聽的端口不能是4560
關於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