官术网_书友最值得收藏!

  • ELK stack權(quán)威指南
  • 饒琛琳
  • 914字
  • 2018-12-31 21:08:14

3.6 Java日志

之前在2.2節(jié)有關(guān)codec的介紹中曾經(jīng)提到過(guò),對(duì)Java日志,除了使用multiline做多行日志合并以外,還可以直接通過(guò)Log4J寫(xiě)入logstash里。本節(jié)就講述如何在Java應(yīng)用環(huán)境做到這點(diǎn)。

3.6.1 Log4J配置

首先,需要配置Java應(yīng)用的Log4J設(shè)置,啟動(dòng)一個(gè)內(nèi)置的SocketAppender。修改應(yīng)用的log4j.xml配置文件,添加如下配置段:

<appender name=“LOGSTASH” class=“org.apache.log4j.net.SocketAppender”>
<param name=“RemoteHost” value=“l(fā)ogstash_hostname” />
<param name=“ReconnectionDelay” value=“60000” />
<param name=“LocationInfo” value=“true” />
<param name=“Threshold” value=“DEBUG” />
</appender>

然后把這個(gè)新定義的appender對(duì)象加入root logger里,可以跟其他已有l(wèi)ogger共存:

<root>
<level value=“INFO”/>
<appender-ref ref=“OTHERPLACE”/>
<appender-ref ref=“LOGSTASH”/>
</root>

如果是log4j.properties配置文件,則對(duì)應(yīng)配置如下:

log4j.rootLogger=DEBUG, logstash
###SocketAppender###
log4j.appender.logstash=org.apache.log4j.net.SocketAppender
log4j.appender.logstash.Port=4560
log4j.appender.logstash.RemoteHost=logstash_hostname
log4j.appender.logstash.ReconnectionDelay=60000
log4j.appender.logstash.LocationInfo=true

Log4J會(huì)持續(xù)嘗試連接你配置的logstash_hostname這個(gè)地址,建立連接后,即開(kāi)始發(fā)送日志數(shù)據(jù)。

3.6.2 Logstash配置

Java應(yīng)用端的配置完成以后,開(kāi)始設(shè)置Logstash的接收端。配置如下所示,其中4560端口是Log4J SocketAppender的默認(rèn)對(duì)端端口:

input {
  log4j {
    type =>“l(fā)og4j-json”
    port => 4560
  }
}

3.6.3 異常堆棧測(cè)試驗(yàn)證

運(yùn)行Logstash后,編寫(xiě)一個(gè)簡(jiǎn)單的Log4J程序:

import org.apache.log4j.Logger;
public class HelloExample{
    final static Logger logger = Logger.getLogger(HelloExample.class);
    public static void main(String[] args) {
        HelloExample obj = new HelloExample();
        try{
            obj.divide();
        }catch(ArithmeticException ex){
            logger.error(“Sorry, something wrong!”, ex);
        }
    }
    private void divide(){
        int i = 10 /0;
    }
}

編譯運(yùn)行:

# javac -cp ./logstash-1.5.0.rc2/vendor/bundle/jruby/1.9/gems/logstash-input-
    log4j-0.1.3-java/lib/log4j/log4j/1.2.17/log4j-1.2.17.jar HelloExample.java
# java -cp .:./logstash-1.5.0.rc2/vendor/bundle/jruby/1.9/gems/logstash-input-
    log4j-0.1.3-java/lib/log4j/log4j/1.2.17/log4j-1.2.17.jar HelloExample

這樣即可在Logstash的終端輸出看到如下事件記錄:

{“message” =>“Sorry, something wrong!”,“@version” =>“1”,“@timestamp” =>“2015-07-02T13:24:45.727Z”,“type” =>“l(fā)og4j-json”,“host” =>“127.0.0.1:52420”,“path” =>“HelloExample”,“priority” =>“ERROR”,“l(fā)ogger_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)”
}

可以看到,異常堆棧直接記錄在單行內(nèi)了。

3.6.4 JSON Event layout

如果無(wú)法采用SocketAppender,必須使用文件方式的,其實(shí)Log4J有一個(gè)layout特性,用來(lái)控制日志輸出的格式。和Nginx日志自己拼接JSON輸出類(lèi)似,也可以通過(guò)layout功能記錄成JSON格式。

Logstash官方提供了擴(kuò)展包,可以通過(guò)mvnrepository.com搜索下載:

# wget http://central.maven.org/maven2/net/logstash/log4j/jsonevent-layout/1.7/
    jsonevent-layout-1.7.jar

或者直接編輯自己項(xiàng)目的pom.xml添加依賴(lài):

<dependency>
    <groupId>net.logstash.log4j</groupId>
    <artifactId>jsonevent-layout</artifactId>
    <version>1.7</version>
</dependency>

然后修改項(xiàng)目的log4j.properties文件如下:

log4j.rootCategory=WARN, RollingLog
log4j.appender.RollingLog=org.apache.log4j.DailyRollingFileAppender
log4j.appender.RollingLog.Threshold=TRACE
log4j.appender.RollingLog.File=api.log
log4j.appender.RollingLog.DatePattern=.yyyy-MM-dd
log4j.appender.RollingLog.layout=net.logstash.log4j.JSONEventLayoutV1

如果是log4j.xml,則修改如下:

<appender name=“Console” class=“org.apache.log4j.ConsoleAppender”>
    <param name=“Threshold” value=“TRACE” />
    <layout class=“net.logstash.log4j.JSONEventLayoutV1” />
</appender>

生成的文件就是符合Logstash標(biāo)準(zhǔn)的JSON格式了,Logstash使用下面配置讀取:

input {
    file {
        codec => json
        path => [“/path/to/log4j.log”]
    }
}

生成的Logstash事件如下:

{
“mdc”:{},
“l(fā)ine_number”:“29”,
“class”:“org.eclipse.jetty.examples.logging.EchoFormServlet”,
“@version”:1,
“source_host”:“jvstratusmbp.local”,
“thread_name”:“qtp513694835-14”,
“message”:“Got request from 0:0:0:0:0:0:0:1%0 using Mozilla\/5.0 (Macintosh;
      Intel Mac OS X 10_9_1) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/32.0.
      1700.77 Safari\/537.36”,
“@timestamp”:“2014-01-27T19:52:35.738Z”,
“l(fā)evel”:“INFO”,
“file”:“EchoFormServlet.java”,
“method”:“doPost”,
“l(fā)ogger_name”:“org.eclipse.jetty.examples.logging.EchoFormServlet”
}

可以看到,同樣達(dá)到了效果。

如果你使用的不是Log4J而是logback項(xiàng)目來(lái)記錄Java日志,Logstash官方也有類(lèi)似的擴(kuò)展包,在pom.xml中改成如下定義即可:

<dependency>
  <groupId>net.logstash.logback</groupId>
  <artifactId>logstash-logback-encoder</artifactId>
  <version>4.4</version>
</dependency>
主站蜘蛛池模板: 连平县| 观塘区| 永善县| 竹北市| 广汉市| 阜新市| 茂名市| 盘山县| 周宁县| 恭城| 东城区| 阿尔山市| 汨罗市| 韶关市| 乐都县| 靖州| 怀安县| 阳原县| 禄丰县| 工布江达县| 农安县| 泊头市| 景泰县| 台东市| 霍城县| 丰镇市| 蓝田县| 柳江县| 阳谷县| 安庆市| 无极县| 远安县| 恩施市| 银川市| 玉门市| 山东省| 白沙| 肥城市| 始兴县| 宁城县| 文水县|