最近需要使用Elasticsearch做一個日志系統,本文只介紹log4j內容同步到Elasticsearch,至於日志的查詢和分類,會在后面介紹。
一、配置並打開Elasticsearch
這個操作不在敘述,需要注意的是,本文使用的是elasticsearch-5.6.8版本的elasticsearch,所以logstash和filebeat也是5.6.8,本文使用的環境是windows系統。
二、配置filebeat
之前我們已經介紹了使用logstash來同步mysql數據庫,那么logstash是否也能同步log4j?在查詢文檔后發現,logstash在低版本情況下是可以直接同步log4j的,但是如果使用logstash5.X的版本,logstash變不在支持log4j轉而將這個功能放入到了Filebeat實現,所以使用log4j的日志系統將采用Elasticsearch+logstash +filebeat+log4j的形式。
首先介紹一下什么是Filebeat。Filebeat是一個日志文件托運工具,在你的服務器上安裝客戶端后,filebeat會監控日志目錄或者指定的日志文件,追蹤讀取這些文件(追蹤文件的變化,不停的讀),並且轉發這些信息到elasticsearch或者logstarsh中存放,接下來將介紹配置filebeat。
1.下載filebeat,需要注意的是filebeat版本應該elasticsearch版本一致,官網地址:
https://www.elastic.co/downloads/beats/filebeat
2.修改filebeat文件中的filebeat.yml文件
input_type:long
path:
- 你的log4j文件絕對路徑
在filebeat.yml文件中的Elasticsearch output項可以修改Elasticsearch 的地址
在filebeat.yml文件中的Logstash output項修改Logstash的地址(這個地址和端口號必須與接下來配置Logstash的.conf文件一致)
以上的配置已經可以同步,其他的詳細配置,可以參考這篇博客:https://blog.csdn.net/haozhuxuan/article/details/79738447
3.啟動filebeat
打開命令終端,進入filebeat文件夾運行:
filebeat -e -c filebeat.yml
三、配置Logstash文件
1.在Logstash文件夾下創建conf文件夾
2.在創建的conf文件夾中創建log4j.conf文件,文件的內容為:
input{ beats { port => 9600 } } output{ stdout{ codec => rubydebug } elasticsearch { hosts => "localhost:9200" index => "t-server-%{+YYYY.MM.dd}" document_type => "log4j_type" } }
3.運行log4j.conf文件:
使用windows終端進入Logstash文件下,運行:
logstash -f ../conf/log4j.conf
完成這一步,整個同步過程就已經完成了
四、測試
本文使用的是spring boot項目,需要添加log4j的依賴:
<dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency>
在application.properties同一級下創建log4j.properties文件:
### 設置###
log4j.rootLogger = debug,stdout,D
### 輸出信息到控制抬 ###
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 級別以上的日志到=E:/log/debug.log
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File =E:/log/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
編寫測試代碼:

import org.apache.log4j.Logger; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class LoginController { private static final Logger logger = Logger.getLogger(LoginController.class); @RequestMapping("/getUser") public String getUser(){ logger.debug("debug message!"); logger.info("info message!"); logger.warn("warn message!"); logger.error("error message!"); try{ System.out.println(10/0); }catch(Exception e){ logger.error(e); } return "返回成功"; } }
訪問:http://localhost:8880/getUser 后,我們可以在head中看見,剛才的日志信息已經同步到Elasticsearch中