[logstash-input-log4j]插件使用詳解

Log4j插件能夠經過log4j.jar獲取Java日誌,搭配Log4j的SocketAppenderSocketHubAppender使用,經常使用於簡單的集羣日誌彙總。html

最小化的配置

input { log4j { host=>"localhost" port=>4560 } } output { stdout {} }

  log4j插件配置host以及port就能監聽localhost上的4560端口的log4j消息。java

  此時,若是你的log4j向本地主機以SocketAppender的方式輸出日誌消息,Logstash就能捕獲到,參考的log4j配置文件以下:apache

<?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"api

  server就是把logstash看作是日誌的服務器,接收log4j主機端生成的日誌消息。服務器

  client則是把logstash看作是tcp的發起者,請求log4j主機返回日誌消息。app

 

  host 主機地址,字符串類型,如"localhost"或者"192.168.0.1"socket

  若是是server模式,就是監聽的主機地址tcp

  若是是client模式,就是鏈接的目標地址ide

 

  port 端口號,數字類型,如 4567 或者 12345ui

  若是是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

相關文章
相關標籤/搜索