one:Elasticsearch , Logstash, Kibana ,FileBeat
序:
一般我們需要進行日志分析場景,往往應運營需要, 對應用進行日志分析,其次也是 為運營推廣提供有用的運營數據,使運營推廣具有目的性、針對性和直接性,就是運營想知道,用戶行為是什么樣的,用戶更關心的是什么等等一系列問題;那我們如何做到呢?通常我們的做法是直接對日志文件進行grep、awk等命令就可以獲得想要的信息。但是,隨着用戶體量的增加,支撐的節點也隨之增加,那么傳統方法暴露出很多問題,比如:效率低下,日志量太大如何歸檔、文本搜索太慢怎么辦、如何多維度查詢等等。這就需要我們集中化處理我們的日志,那么如何對所有服務器上的日志進行收集匯總?常見解決思路是建立集中式日志收集系統,將所有節點上的日志統一收集,管理,訪問。
一個完整的集中式日志系統,需要包含以下幾個主要特點:
收集-能夠采集多種來源的日志數據
傳輸-能夠穩定的把日志數據傳輸到中央系統
存儲-如何存儲日志數據
分析-可以支持 UI 分析
警告-能夠提供錯誤報告,監控機制
ELK提供了一整套解決方案,並且都是開源軟件,之間互相配合使用,完美銜接,高效的滿足了很多場合的應用。目前主流的一種日志系統。
ELK是三個開源軟件的縮寫,分別表示:Elasticsearch , Logstash, Kibana , 它們都是開源軟件。新增了一個FileBeat,它是一個輕量級的日志收集處理工具(Agent),Filebeat占用資源少,適合於在各個服務器上搜集日志后傳輸給Logstash,官方也推薦此工具。
Elasticsearch是個開源分布式搜索引擎,提供搜集、分析、存儲數據三大功能。它的特點有:分布式,零配置,自動發現,索引自動分片,索引副本機制,restful風格接口,多數據源,自動搜索負載等。
Logstash 主要是用來日志的搜集、分析、過濾日志的工具,支持大量的數據獲取方式。一般工作方式為c/s架構,client端安裝在需要收集日志的主機上,server端負責將收到的各節點日志進行過濾、修改等操作在一並發往elasticsearch上去。
Kibana 也是一個開源和免費的工具,Kibana可以為 Logstash 和 ElasticSearch 提供的日志分析友好的 Web 界面,可以幫助匯總、分析和搜索重要數據日志。
這是常見的FELK的結構圖:
下載安裝,二進制包,解壓就可用;下面我們看一下,用logstash收集系統secure日志和nginx日志,首先我們來看一下secure的logstash收集配置文件:
input { file { type => "system" path => [ "/var/log/secure" ] start_position => "beginning" } } filter { grok { add_tag => [ "valid" ] match => [ "message", "%{SYSLOGTIMESTAMP:syslog_date} %{SYSLOGHOST:syslog_host}%{DATA:syslog_program}(?:\[%{POSINT}\])?: %{WORD:login} password for %{USERNAME:username} from %{IP:ip} %{GREEDYDATA}", "message", "%{SYSLOGTIMESTAMP:syslog_date} %{SYSLOGHOST:syslog_host}%{DATA:syslog_program}(?:\[%{POSINT}\])?: message repeated 2 times: \[ %{WORD:login} password for %{USERNAME:username} from %{IP:ip} %{GREEDYDATA}", "message", "%{SYSLOGTIMESTAMP:syslog_date} %{SYSLOGHOST:syslog_host}%{DATA:syslog_program}(?:\[%{POSINT}\])?: %{WORD:login} password for invalid user %{USERNAME:username} from %{IP:ip} %{GREEDYDATA}", "message", "%{SYSLOGTIMESTAMP:syslog_date} %{SYSLOGHOST:syslog_host}%{DATA:syslog_program}(?:\[%{POSINT}\])?: %{WORD:login} %{WORD:auth_method} for %{USERNAME:username} from %{IP:ip} %{GREEDYDATA}" ] } if "valid" not in [tags] { drop { } } mutate { remove_tag => [ "valid" ] lowercase => [ "login" ] } date { match => [ "syslog_date", "MMM d HH:mm:ss", "MMM dd HH:mm:ss", "ISO8601" ] timezone => "Asia/Shanghai" } geoip { source => "ip" fields => ["city_name"] database => "/usr/local/lnmp/logstash/GeoLite2-City.mmdb" } } output { # stdout { codec => rubydebug } elasticsearch { hosts => [ "10.9.117.83:9200", "10.9.165.245:9200", "10.9.13.93:9200" ] index => "logstash-ssh-login-%{+YYYY.MM.dd}" } }
supervisor管理如下:
[program:ssh] stdout_logfile=/data/logs/supervisor/ssh_stdout.log redirect_stderr=true environment=JAVA_HOME="/usr/local/lnmp/jdk1.8.0_151" command=/usr/local/lnmp/logstash/bin/logstash -f /usr/local/lnmp/logstash/config/ssh-login.conf --path.data /usr/local/lnmp/logstash/ssh_data user=root autostart=true autorestart=true startsecs=3
查看運行實例:
# supervisorctl status nginx RUNNING pid 5489, uptime 22:37:49 ssh RUNNING pid 5490, uptime 22:37:49
kibana配置:
nginx 配置如下:
input { file { type => "nginx_log" path => ["/data/logs/wwwlogs/www.log", "/data/logs/wwwlogs/test.log"] } } filter { mutate { replace => { "type" => "nginx_access" } replace => { "host" => "10-19-72-229" } } grok { match => { "message" => "%{NGINXACCESS}" } overwrite => [ "message" ] } date { match => [ "timestamp", "dd/MMM/YYYY:HH:mm:ss Z"] } geoip { source => "clientip" target => "geoip" database => "/usr/local/lnmp/logstash/GeoLite2-City.mmdb" add_tag => [ "nginx-geoip" ] add_field => [ "[geoip][coordinates]", "%{[geoip][longitude]}" ] add_field => [ "[geoip][coordinates]", "%{[geoip][latitude]}" ] } } output { elasticsearch { hosts => [ "10.9.117.83:9200", "10.9.165.245:9200", "10.9.13.93:9200" ] index => "logstash-nginx-access-%{+YYYY.MM.dd}" } # stdout { codec => rubydebug } }
在logstash根下面創建一個patterns目錄並創建nginx文件,內容如下:
NGUSERNAME [a-zA-Z\.\@\-\+_%]+ NGUSER %{NGUSERNAME} NGINXACCESS %{IPORHOST:clientip} - %{NOTSPACE:remote_user} \[%{HTTPDATE:timestamp}\] \"(?:%{WORD:verb} %{NOTSPACE:request}(?: HTTP/%{NUMBER:httpversion})?|%{DATA:rawrequest})\" %{NUMBER:response} (?:%{NUMBER:bytes}|-) %{QS:referrer} %{QS:agent} %{NOTSPACE:http_x_forwarded_for}
supervisor管理:
[program:nginx] stdout_logfile=/data/logs/supervisor/nginx_stdout.log redirect_stderr=true environment=JAVA_HOME="/usr/local/lnmp/jdk1.8.0_151" command=/usr/local/lnmp/logstash/bin/logstash -f /usr/local/lnmp/logstash/config/nginx.conf --path.data /usr/local/lnmp/logstash/nginx_data user=root autostart=true autorestart=true startsecs=3
kibana配置如下:
ELK最近的幾個版本又推出了beats集, 並推薦使用它們!