1. 程式人生 > >[logstash-input-log4j]外掛使用詳解

[logstash-input-log4j]外掛使用詳解

Log4j外掛可以通過log4j.jar獲取Java日誌,搭配Log4j的SocketAppenderSocketHubAppender使用,常用於簡單的叢集日誌彙總。

最小化的配置

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外掛大致的內容就是如此了。

參考