最近有個項目需求,須要統計下用戶app的使用狀況,好比:何時登陸的,查詢了什麼內容等信息。html
1.定義用戶軌跡模型,每步操做都寫到數據庫中,而後在前端展現。前端
2.用現成的用戶數據分析平臺,網上有不少成熟的平臺,對接其api接口便可。docker
3.ELK,集中式日誌管理,特色:收集,傳輸,存儲,管理,告警。數據庫
Elasticsearch:負責日誌檢索和分析
Logstash:負責日誌的收集,處理和儲存
Kibana:負責日誌的可視化
對於保存日誌到文件的的項目,能夠用logstash的logstash-input-file插件直接進行文件讀取,處理後轉存到Elasticsearch中。處理能夠用logstash-filter-kv鍵值插件或者logstash-filter-mutate等插件進行解析。具體查看Filter plugins。json
因爲咱們的項目沒有記錄日誌文件,因此選擇直接發送日誌信息到logstash,(對於log4j,logstash有專門的input插件)。api
<?xml version="1.0" encoding="UTF-8"?> <Configuration> <Properties> <Property name="PATTERN">{"logger": "%logger", "level": "%level", "msg": "%message"}%n</Property> </Properties> <Appenders> <Socket name="logstash-tcp" host="127.0.0.1" port="4560" protocol="TCP"> <PatternLayout pattern="${PATTERN}"/> </Socket> </Appenders> <Loggers> <Root level="INFO"> <AppenderRef ref="logstash-tcp" /> </Root> </Loggers> </Configuration>
input { tcp { host => "127.0.0.1" port => 4560 codec => json { charset => "UTF-8" } } } filter { } output { elasticsearch { hosts => ["localhost"] manage_template => false index => "logstash-%{+YYYY.MM.dd}" document_type => "logstash" } }
轉存到Elasticsearch的message就是咱們log4j2配置中的Json形式,若是想要將message拉平,那麼只須要加入logstash-filter-json。app
filter { json { source => "message" } }
這樣保存到Elasticsearch中的數據,就會變成以下形式elasticsearch
{ ... "message" => "{\"logger\": \"elk\", \"level\": \"INFO\", \"msg\": \"logstash test\"}\r", "logger" => "elk", "level" => "INFO", "msg" => "logstash test" }
這樣對於Kibana分析的時候比較方便。tcp
log4j2用Socket的方式會有一個問題,當logstash斷掉,重啓後你會發現收不到log4j2的日誌了,傳輸斷掉沒有重連。在生產環境中,elk斷掉,咱們不可能在去重啓全部與之相連的服務。因此接下來咱們採用gelf方式。
<dependency> <groupId>biz.paluch.logging</groupId> <artifactId>logstash-gelf</artifactId> <version>1.12.0</version> </dependency>
<?xml version="1.0" encoding="UTF-8"?> <Configuration> <Appenders> <Gelf name="logstash-gelf" host="tcp:127.0.0.1" port="4560" version="1.1"> <Field name="timestamp" pattern="%d{yyyy-MM-dd HH:mm:ss.SSS}" /> <Field name="logger" pattern="%logger" /> <Field name="level" pattern="%level" /> <Field name="className" pattern="%C" /> <Field name="method" pattern="%M" /> <Field name="line" pattern="%L" /> <Field name="server" pattern="%host" /> </Gelf> </Appenders> <Loggers> <Root level="INFO"> <AppenderRef ref="logstash-gelf" /> </Root> </Loggers> </Configuration>
input { gelf { host => "127.0.0.1" port => 4560 use_tcp => true codec => json { charset => "UTF-8" } } } filter { json { source => "message" } } output { elasticsearch { hosts => ["localhost"] manage_template => false index => "logstash-%{+YYYY.MM.dd}" document_type => "logstash" } }
保存到Elasticsearch中的數據就會如同log4j2中的配置格式同樣,因爲咱們這裏依然配置了json filter,若是你的message是json字串,這裏依然會拉平處理。分佈式
以上咱們log4j2與logstash的對接就完成了,對於docker部署elk,比較簡單,網上有不少教程,固然仍是推薦你們先去官網看看,注意版本對應。我選擇的是sebp/elk,集成好的elk容器。詳細的文檔elk-docker
這裏主要說說須要注意的地方,強烈建議安裝以前看下文檔中的Prerequisites。
sysctl -w vm.max_map_count=262144
持久性的作法是修改/etc/sysctl.conf文件中的vm.max_map_count
echo "vm.max_map_count=262144" > /etc/sysctl.conf sysctl -p
以上是我在對接elk的時候遇到的問題,再次記錄下,更多的elk內容後續會繼續探索。