ELK日誌處理之使用logstash收集log4J日誌
介紹一下如何從Java工程中匯出log4J日誌到Logstash。
一、log4j基礎
不能免俗的官方介紹:
Log4j 是一個使用 Java 語言編寫的,可靠、快速、靈活的日誌框架(API),使用 Apache Software License 授權。它被移植到 C、C++、C#、Perl、Python、Ruby 和 Eiffel 語言中。
Log4j 是高度可配置的,在執行期使用外部的配置檔案對其進行配置。它按照優先級別記錄日誌,並可將日誌資訊定向輸出到各種介質,比如資料庫、檔案、控制檯、Unix Syslog等。
Log4j 主要由三部分組成:
- loggers:負責採集日誌資訊。
- appenders:負責將日誌資訊釋出到不同地方。
- layouts:負責以各種風格格式化日誌資訊。
二、新建Java工程
下面通過實際的工程配置學習如何配置log4j。
開啟Eclipse或者Intellij Idea,新建一個maven工程。工程目錄結構如下圖所示:
pom.xml檔案中加入log4j的依賴,版本為1.2.17
,pom.xml中的程式碼如下:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.logs</groupId> <artifactId>log4idemo1</artifactId> <version>1.0-SNAPSHOT</version> <!-- https://mvnrepository.com/artifact/log4j/log4j --> <dependencies> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> </dependencies> </project>
在resource目錄下新建log4j.properties,加入以下配置:
### 設定### log4j.rootLogger = debug,stdout,D,E,logstash ### 輸出資訊到控制擡 ### log4j.appender.stdout = org.apache.log4j.ConsoleAppender log4j.appender.stdout.Target = System.out log4j.appender.stdout.layout = org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n ### 輸出DEBUG 級別以上的日誌到=/Users/bee/Documents/elk/log4j/debug.log### log4j.appender.D = org.apache.log4j.DailyRollingFileAppender log4j.appender.D.File = /Users/bee/Documents/elk/log4j/debug.log log4j.appender.D.Append = true log4j.appender.D.Threshold = DEBUG log4j.appender.D.layout = org.apache.log4j.PatternLayout log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n ### 輸出ERROR 級別以上的日誌到=/Users/bee/Documents/elk/log4j/error.log ### log4j.appender.E = org.apache.log4j.DailyRollingFileAppender log4j.appender.E.File =/Users/bee/Documents/elk/log4j/error.log log4j.appender.E.Append = true log4j.appender.E.Threshold = ERROR log4j.appender.E.layout = org.apache.log4j.PatternLayout log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n #輸出日誌到logstash log4j.appender.logstash=org.apache.log4j.net.SocketAppender log4j.appender.logstash.RemoteHost=127.0.0.1 log4j.appender.logstash.port=4560 log4j.appender.logstash.ReconnectionDelay=60000 log4j.appender.logstash.LocationInfo=true
配置檔案中,把日誌輸出了四份:
- 第一份輸出到控制檯
- 第二份把DEBUG 級別以上的日誌到檔案
- 第三份把輸出ERROR 級別以上的日誌到檔案
- 第四份輸出到logstash
在java目錄下新增Log4jTest.java,內容如下:
import org.apache.log4j.Logger;
/**
* Created by bee on 17/3/6.
*/
public class Log4jTest {
public static final Logger logger=Logger.getLogger(Log4jTest.class);
public static void main(String[] args) {
logger.debug("This is a debug message!");
logger.info("This is info message!");
logger.warn("This is a warn message!");
logger.error("This is error message!");
try{
System.out.println(5/0);
}catch(Exception e){
logger.error(e);
}
}
}
三、配置logstash
(logstash的安裝和hello world教程請點這裡http://blog.csdn.net/napoay/article/details/53276758)這裡使用logstash2.3.3和Elasticsearch 2.3.3,首先啟動Elasticsearch,然後在logstash-2.3.3/conf目錄下新建配置檔案log4j-es.conf,檔案內容如下:
input {
log4j {
host => "127.0.0.1"
port => 4560
}
}
output {
stdout {
codec => rubydebug
}
elasticsearch{
hosts => ["localhost:9200"]
index => "log4j-%{+YYYY.MM.dd}"
document_type => "log4j_type"
}
}
配置檔案中指定日誌輸出有2份,一份輸出到console,一份輸出到Elasticsearch。
啟動logstash:
sudo ./bin/logstash -f conf/log4j-es.conf
如果你已經啟動了Elasticsearch,IP和埠都是通暢的,配置檔案無誤,啟動成功後的介面如下:
執行Log4jTest.java,在終端中可以看到以下輸出:
在Elasticsearch中檢視匯入的日誌:
四、總結
上述配置完成了日誌的產生,到logstash,再到Elasticsearch,介紹完畢。
掃碼向博主提問
中科院碩士_姚攀
部落格專家
熟悉Lucene、ES、ELK