第十章· Logstash深刻-Logstash與Redis那點事

Logstash將日誌寫入Redis

爲何要使用Redis

在企業中,日誌規模的量級遠遠超出咱們的想象,這就是爲何會有一家公司日誌易專門作日誌收集,給大型金融公司收集日誌,好比銀行,由於你有可能看到,1秒鐘好幾千萬的日誌量,往服務器寫入,那麼企業中的集羣,架構都不是單臺的,而是多臺的,一臺若是是1千萬,那麼5臺的量級,10臺的量級,咱們要對他們進行收集,進行分析,不免會在網絡傳輸過程當中,丟數據。php

日誌是什麼?
日誌對於企業來講,有什麼做用?
用戶使用咱們的產品,體驗如何?
用戶的客訴,咱們能拿出什麼樣的數據來講話?
...css

一系列的問題,都和日誌相關,若是相當重要的那個數據丟失了,那麼公司的損失可不單單是一條日誌那麼簡單。若是咱們不知道,用戶對咱們產品最感興趣的地方在哪,那麼產品的壽命也就愈來愈短。若是被攻擊了,惡意攻擊的IP源咱們都找不到,那麼或許就不是產品的壽命愈來愈短,而是這個企業存在的壽命,愈來愈短。html

python

好吧,一頓排比句,說的那麼浮誇,說白了,我就是想要告訴大家,一個大規模日誌量級的企業想要作到數據的安全性,數據的一致性,咱們須要消息隊列:Redis , Kafka,在ELK5版本中,建議使用Redis來作消息隊列,Kafka能不能用?也能,只不過會有一些沒必要要的坑,須要咱們去爬。在ELK6版本中,開始使用Kafka來作消息隊列。nginx

話很少說,咱們接下來就開始將Logstash收集到的日誌,輸出到Redis中。redis


Redis部署
#下載 [root@db04 ~]# wget http://download.redis.io/releases/redis-3.2.12.tar.gz #解壓 [root@db04 ~]# tar xf redis-3.2.12.tar.gz #移動到指定目錄 [root@db04 ~]# mv redis-3.2.12 /application/ #作軟連接 [root@db04 ~]# ln -s /application/redis-3.2.12 /application/redis #進入redis目錄 [root@db04 ~]# cd /application/redis #編譯 [root@db04 redis]# make #添加環境變量 [root@db04 redis]# vim /etc/profile.d/redis.sh export PATH="/application/redis/src:$PATH" #建立配置文件存放目錄 [root@db04 ~]# mkdir -p /data/6379 #編輯redis配置文件 [root@db04 ~]# vim /data/6379/redis.conf port 6379 daemonize yes pidfile /data/6379/redis.pid logfile "/data/6379/redis.log" dbfilename dump.rdb dir /data/6379 protected-mode no requirepass zls #啓動redis [root@db04 ~]# redis-server /data/6379/redis.conf 

Logstash收集日誌輸出至Redis
#進入Logstash配置文件目錄 [root@elkstack03 ~]# cd /etc/logstash/conf.d/ #編輯Logstash配置文件 [root@elkstack03 conf.d]# vim log_to_redis.conf input { file { path => "/usr/local/tomcat/logs/tomcat_access_log.*.log" start_position => "end" type => "tc" } file { path => "/usr/local/nginx/logs/access_json.log" start_position => "end" type => "ngx" codec => json } } output { if [type] == "tc" { redis { data_type => "list" key => "tomcat_log" host => "10.0.0.54" port => "6379" db => "0" password => "zls" } } if [type] == "ngx" { redis { data_type => "list" key => "nginx_log" host => "10.0.0.54" port => "6379" db => "1" password => "zls" } } } #啓動Logstash [root@elkstack03 conf.d]# /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/log_to_redis.conf & 

驗證Redis數據
#鏈接redis [root@elkstack04 ~]# redis-cli -a zls #在0庫中查看全部key 127.0.0.1:6379> KEYS * 1) "tomcat_log" #查看tomcat_log的長度(日誌的條數) 127.0.0.1:6379> LLEN tomcat_log (integer) 8 #切換1庫 127.0.0.1:6379> SELECT 1 OK #在1庫中查看全部key 127.0.0.1:6379[1]> KEYS * 1) "nginx_log" #查看nginx_log的長度(日誌的條數) 127.0.0.1:6379[1]> LLEN nginx_log (integer) 6 #演示Logstash如何取走一條tomcat日誌 127.0.0.1:6379> LPOP tomcat_log "{\"path\":\"/usr/local/tomcat/logs/tomcat_access_log.2019-04-08.log\",\"@timestamp\":\"2019-04-08T13:43:35.779Z\",\"@version\":\"1\",\"host\":\"0.0.0.0\",\"message\":\"{\\\"clientip\\\":\\\"10.0.0.53\\\",\\\"ClientUser\\\":\\\"-\\\",\\\"authenticated\\\":\\\"-\\\",\\\"AccessTime\\\":\\\"[08/Apr/2019:21:43:34 +0800]\\\",\\\"method\\\":\\\"GET / HTTP/1.1\\\",\\\"status\\\":\\\"304\\\",\\\"SendBytes\\\":\\\"-\\\",\\\"Query?string\\\":\\\"\\\",\\\"partner\\\":\\\"-\\\",\\\"AgentVersion\\\":\\\"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36\\\"}\",\"type\":\"tc\"}" #再次查看長度 127.0.0.1:6379> Llen tomcat_log (integer) 7 #演示Logstash如何取走一條nginx日誌 127.0.0.1:6379[1]> LPOP nginx_log "{\"referer\":\"-\",\"type\":\"ngx\",\"http_host\":\"www.elk.com\",\"url\":\"/index.html\",\"path\":\"/usr/local/nginx/logs/access_json.log\",\"upstreamhost\":\"-\",\"@timestamp\":\"2019-04-08T13:43:19.000Z\",\"size\":0,\"clientip\":\"10.0.0.53\",\"domain\":\"www.elk.com\",\"host\":\"10.0.0.53\",\"@version\":\"1\",\"responsetime\":0.0,\"xff\":\"10.0.0.1\",\"upstreamtime\":\"-\",\"status\":\"304\"}" #再次查看長度 127.0.0.1:6379[1]> LLEN nginx_log (integer) 5 

json


Logstash從Redis中取出日誌輸出到ES
#進入Logstash配置文件目錄 [root@elkstack03 ~]# cd /etc/logstash/conf.d/ #編輯Logstash配置文件 [root@elkstack03 conf.d]# vim redis_to_es.conf input { redis { data_type => "list" key => "tomcat_log" host => "10.0.0.54" port => "6379" db => "0" password => "zls" codec => "json" } redis { data_type => "list" key => "nginx_log" host => "10.0.0.54" port => "6379" db => "1" password => "zls" } } output { if [type] == "tc" { elasticsearch { hosts => ["10.0.0.51:9200"] index => "m.elk.com-%{+YYYY.MM.dd}" } } if [type] == "ngx" { elasticsearch { hosts => ["10.0.0.51:9200"] index => "www.elk.com-%{+YYYY.MM.dd}" } } } #啓動Logstash [root@elkstack03 conf.d]# /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/redis_to_es.conf & 

驗證Logstash中的數據是否被取出
#鏈接Redis [root@elkstack04 ~]# redis-cli -a zls #查看全部key 127.0.0.1:6379> KEYS * (empty list or set) #切換1庫 127.0.0.1:6379> SELECT 1 OK #查看全部key 127.0.0.1:6379[1]> KEYS * (empty list or set) 

vim


在ES中查看數據

打開瀏覽器,訪問:http://10.0.0.51:9100/瀏覽器

tomcat


將ES索引添加到Kibana中

打開瀏覽器,訪問:http://10.0.0.54:5601

查看Kibana數據

Redis key堆積監控

實際環境當中,可能會出現reids當中堆積了大量的數據而logstash因爲種種緣由未能及時提取日誌,此時會致使redis服務器的內存被大量使用,甚至出現以下內存即將被使用完畢的情景.

[root@elkstack01 ~]# vim redis_keylenth.py #!/usr/bin/env python #coding:utf-8 #Author Driver_Zeng import redis def redis_conn(): pool=redis.ConnectionPool(host="10.0.0.54",port=6379,db=2,password='zls') conn = redis.Redis(connection_pool=pool) data = conn.llen('tn') print(data) redis_conn() [root@elkstack01 ~]# python3 redis_keylenth.py 259 

相關文章
相關標籤/搜索