今天主要是把我们elkstack业务早起设计缺陷的痛点拿出来和大家分享,通过今天的学习,相信我和大家都会收获颇多。
一、redis可以解决什么问题?
- 服务器内存即将被使用完毕,查看是因为redis服务保存了大量的数据没有被读取而占用了大量的内存空间。
- logstach服务器异常,filebeat收集的数据丢失
以上这些问题,都可以使用中间件来巧妙的化解,下面我们就用一台服务器按照部署redis服务,专门用于日志缓存使用,用于web服务器产生大量日志的场景。
二、部署redis
三、filebeat收集单个类型日志并写入redis
Filebeat支持将数据直接写入到redis服务器,本步骤为写入到redis当中的一个可以,另外filebeat还支持写入到elasticsearch、logstash等服务器。
1.filebeat配置
filebeat.prospectors:
- input_type: log
paths:
- /var/log/messages
- /var/log/nginx/*access.log
exclude_lines: ["^DBG","^$"]
document_type: system-log-5612
output.redis:
hosts: ["192.168.56.13:6379"]
key: "system-log-5612" #为了后期日志处理,建议自定义key名称
db: 1 #使用第几个库
timeout: 5 #超时时间
password: 123456 #redis密码
2.验证redis是否有数据:
[root@elk-server redis]# redis-cli #登陆
127.0.0.1:6379> AUTH 123456 #密码
OK
127.0.0.1:6379> SELECT 1 #选择1号库
OK
127.0.0.1:6379[1]> KEYS * #查看key
1) "system-log-5612"
127.0.0.1:6379[1]> LLEN system-log-5612
(integer) 1738
3,查看redis中的日志数据内容
127.0.0.1:6379[1]> RPOP system-log-5612 #查看内容
四、logstash从redis提取数据
input {
redis {
host => "192.168.56.13"
port => "6379"
db => "1"
password => "123456"
key => "system-log-5612"
data_type => "list"
}
}
output {
elasticsearch {
hosts => ["192.168.56.13:9200"]
index => "system-log-5612"
}
}
报错:忘记加password
,就报错了Logstash could not be started
解决方法:1,删除锁定文件 2,添加password 选项
https://www.jianshu.com/p/1028f77ff16e
查看redis中是否有数据:
head插件和Kibana添加索引查看
如果没有创建,查看下logstash日志报错,或者if判断是否写对。
五、kibana界面添加索引
六、监控redis数据长度
实际环境当中,可能会出现reids当中堆积了大量的数据而logstash由于种种原因未能及时提取日志,此时会导致redis服务器的内存被大量使用,甚至出现如下内存即将被使用完毕的情景
查看reids中的日志队列长度发现有大量的日志堆积在redis 当中:
#!/usr/bin/env python
#coding:utf-8
#URL:www.dgstack.cn
import redis
def redis_conn():
pool=redis.ConnectionPool(host="192.168.56.13",port=6379,db=1,password=123456)
conn = redis.Redis(connection_pool=pool)
data = conn.llen('system-log-5612')
print(data)
redis_conn()
七、遗留问题,
1,加入redis后 原来kibana中web日志格式是json的,现在不是了,终于解决了。
这个问题今日群里大神给我了指点 【感谢 wwbhl 】
filebeat.prospectors:
- input_type: log
paths:
- /var/log/nginx/*access.log
json.keys_under_root: true ##添加如下2行,结课将json格式覆盖原有key
json.overwrite_keys: true
#exclude_lines: ["^DBG","^$"]
document_type: system-log-5612
output.redis:
hosts: ["192.168.56.13:6379"]
key: "system-log-5612"
db: 1
timeout: 5
password: 123456
效果图如下:
2,filebeat 支持 json格式日志的时候支持,无法使用 exclude_lines
法1: 取消exclude功能 【如果您想2者兼得,往下看 法2】
https://elasticsearch.cn/question/4432
法2:
filebeat.prospectors:
- input_type: log
# Paths that should be crawled and fetched. Glob based paths.
paths:
- /var/log/nginx/*access*.log
exclude_lines: ["^DBG","^$"]
processors:
- decode_json_fields:
fields: ["message"]
process_array: false
max_depth: 1
target: ""
overwrite_keys: false
- drop_fields:
fields: ["message"]
法3:
filebeat.prospectors:
- input_type: log
# Paths that should be crawled and fetched. Glob based paths.
paths:
- /var/log/nginx/*access*.log
json.keys_under_root: true
json.overwrite_keys: true
processors:
- drop_event:
when:
regexp:
message: "^DBG|^abc"
更多精彩:ELKstack相关文章
- QQ精品交流群
-
- 微信公众号
-