- 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>
- GitLab CI/CD 從入門(mén)到實(shí)戰(zhàn)
- 敏捷軟件開(kāi)發(fā)(珍藏版)
- 大數(shù)據(jù)處理系統(tǒng):Hadoop源代碼情景分析
- DevSecOps企業(yè)級(jí)實(shí)踐:理念、技術(shù)與案例
- DevOps:企業(yè)級(jí)CI/CD實(shí)戰(zhàn)
- 百度SEO一本通
- Swift從入門(mén)到精通(正式版)
- 服務(wù)端開(kāi)發(fā):技術(shù)、方法與實(shí)用解決方案
- Android5.0新特性實(shí)戰(zhàn)
- Python跨平臺(tái)應(yīng)用軟件開(kāi)發(fā)實(shí)戰(zhàn)
- CATIA V5 從入門(mén)到精通(第二版)
- 搜索架構(gòu)之道:App中的搜索系統(tǒng)設(shè)計(jì)與優(yōu)化實(shí)踐
- Unity手機(jī)游戲開(kāi)發(fā):從搭建到發(fā)布上線全流程實(shí)戰(zhàn)
- 內(nèi)容理解:技術(shù)、算法與實(shí)踐
- 嵌入式軟件調(diào)試技術(shù)