ELK 处理 Percona 审计日志(填坑)
前提
1、有强烈的审计需求。
2、能允许10%-15%左右的性能损失。
3、有强烈的对数据库操作实时查看需求(一般都是为了领导要求)。
Logstash 比较坑的配置
1
2
3
4
5
6
7
8
9
10
11
|
input {
file {
path => ["/u02/backup/audit.log"]
codec => json
}
}
output {
elasticsearch {
hosts => ["192.168.1.233"]
}
}
|
上面的配置看上去是没有问题的,如果是一般的json数据哪就能解析成功了,
但是在 Percona audit plugin 中应用程序应用程序生成的SQL是五花八门,各种字符都有其中有。
如下审计的日志被 python 读取后的字符串展现(红色标记):
从上图可以看到有一些换行后tab的字符,这些字符使用 json.load 的时候会报错,不能解析成json
使用python json 模块解析相关日志文件报错:
1
2
3
4
5
6
7
8
9
10
|
>>> json.loads(json_line)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib64/python2.7/site-packages/simplejson/__init__.py", line 516, in loads
return _default_decoder.decode(s)
File "/usr/lib64/python2.7/site-packages/simplejson/decoder.py", line 370, in decode
obj, end = self.raw_decode(s)
File "/usr/lib64/python2.7/site-packages/simplejson/decoder.py", line 400, in raw_decode
return self.scan_once(s, idx=_w(s, idx).end())
simplejson.scanner.JSONDecodeError: Invalid control character '\t' at: line 1 column 232 (char 231)
|
所以在使用logstash的时候也就解析不了这样的json数据了,
最终logstash只能报错并将整个message记录到 Elasticsearch 中
解决办法
解决办法就是把这些字符替换掉。如下 Logstash 配置文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
input {
file {
path => ["/u02/backup/audit.log"]
}
}
filter {
mutate {
gsub => ["message", "\\\\n", " "]
gsub => ["message", "\t", " "]
replace => [ "message", "%{message}" ]
}
json{
source => "message"
}
mutate {
remove_field => [ "message" ]
}
}
output {
elasticsearch {
hosts => ["192.168.1.233"]
}
}
|
该配置文件是投机取巧的办法, 把 (换行/tab) 字符替换成空格,要注意的一点最终显示的SQL和原来的有所差别。
这种方法有点不灵活如果sql语句中还有遇到一些json不能解析的字符又要进行处理。
>>朋友们如果有更好的方法也告知一声哈!<<<
还不能笑到最后
刚开始以为这一切都万事大吉了。其实还有个一坑就是在使用 Kibana 查看的时候,这时候问题就来了。
有是有过 Percona audit 插件的估计都有这样的问题,就是他记录的是时间是国际形式的(如上图黄色标记),不像我们习惯了北京时间。因此在页面显示的时间会比我们平时的少 8 小时。
一般来说在ELK中使用国际的标准格式是合理的。因为在使用 Kibana 查看的时候会帮你自动转化成本地时间格式。也就是如果我们在中国他会自动把 timezone 转化为 Asia/Shanghai(东8区) 的。所以显示的时间应该是正确的才对。可是实际情况并没有。
没有转化的原因
是应为 Elasticsearch 将 "2016-08-30T01:45:30 UTC" 这串字符解析成了String类型。按道理应该解析成和@timestamp一样的date类型。
解决思路
将 "2016-08-30T01:45:30 UTC" 格式转化成和 @timestamp 一样的格式("2016-08-30T01:45:30Z")
最终配置文件如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
input {
file {
path => ["/u02/backup/audit.log"]
}
}
filter {
mutate {
gsub => ["message", "\\\\n", " "]
gsub => ["message", "\t", " "]
replace => [ "message", "%{message}" ]
}
json{
source => "message"
}
mutate {
remove_field => [ "message" ]
gsub => ["[audit_record][timestamp]", " UTC", "Z"]
replace => [ "[audit_record][timestamp]", "%{[audit_record][timestamp]}" ]
}
}
output {
elasticsearch {
hosts => ["192.168.1.233"]
}
}
|
使用上面配置就能顺利的将 时间格式 转化成 Elasticsearch 想要的时间格式,并且能在 Kibana 中正确显示。
ELK 处理 Percona 审计日志(填坑)的更多相关文章
- Kubernetes Fluentd+Elasticsearch+Kibana统一日志管理平台搭建的填坑指南
在初步完成Kubernetes集群架构的建立后,通过搭建一些监控组件,我们已经能够实现 图形化的监控每个node,pod的状态信息和资源情况 通过scale进行replicateSet的扩展和伸缩 通 ...
- Elasticsearch 填坑记
前言 技术的发展日新月异,传统企业数据库Oracle.SqlServer.DB2,Mysql等在今日不断的被各种大厂自研数据库取代,当然也有类似Elasticsearch等优秀的满足海量数据所使用的开 ...
- GC overhead limit exceeded填坑心得
我遇到这样的问题,本地部署时抛出异常java.lang.OutOfMemoryError:GC overhead limit exceeded导致服务起不来,查看日志发现加载了太多资源到内存,本地的性 ...
- Cloudera Manager 5.9 和 CDH 5.9 离线安装指南及个人采坑填坑记
公司的CDH早就装好了,一直想自己装一个玩玩,最近组了台电脑,笔记本就淘汰下来了,加上之前的,一共3台,就在X宝上买了CPU和内存升级了下笔记本,就自己组了个集群. 话说,好想去捡垃圾,捡台8核16线 ...
- UiAutomator2.0升级填坑记
UiAutomator2.0升级填坑记 SkySeraph May. 28th 2017 Email:skyseraph00@163.com 更多精彩请直接访问SkySeraph个人站点:www.sk ...
- CentOS7.3利用kubeadm安装kubernetes1.7.3完整版(官方文档填坑篇)
安装前记: 近来容器对企业来说已经不是什么陌生的概念,Kubernetes作为Google开源的容器运行平台,受到了大家的热捧.搭建一套完整的kubernetes平台,也成为试用这套平台必须迈过的坎儿 ...
- Android项目开发填坑记-so文件引发的攻坚战
故事的最初 我负责的项目A要求有播放在线视频的功能,当时从别人的聊天记录的一瞥中发现百度有相关的SDK,当时找到的是Baidu-T5Player-SDK-Android-1.4s,项目中Demo的so ...
- Kubernetes审计日志方案
前言 当前Kubernetes(K8S)已经成为事实上的容器编排标准,大家关注的重点也不再是最新发布的功能.稳定性提升等,正如Kubernetes项目创始人和维护者谈到,Kubernetes已经不再是 ...
- ELK实战(Springboot日志输出查找)
需求 把分布式系统,集群日志集中处理快速查询 搭建ELK并与springboot日志输出结合 搭建ELK 基于我前面的elasticsearch搭建博客文档docker-compose.yml基础上进 ...
随机推荐
- MySQL小计
判断不等于某一个数字的时候,数据表为空的字段不参与比较: 判断字段为空用 is null
- Perl构建和打包自己的模块
当写好一个或多个模块后,可以将它构建.打包成"tar.gz",以便让别人安装或者上传到CPAN(如果愿意的话).对于模块的使用者来说,也不用再使用use lib 'LIB_PATH ...
- Go基础系列:为select设置超时时间
Go channel系列: channel入门 为select设置超时时间 nil channel用法示例 双层channel用法示例 指定goroutine的执行顺序 After() 谁也无法保证某 ...
- 关于Newtonsoft.Json,LINQ to JSON的一个小demo
nuget获取Newtonsoft.Json github地址:Newtonsoft.Json public static void Test1() { /* 文本格式如下 代码实现目的: 1.VR ...
- struts2_struts.xml配置文件讲解
1.bean Bean详细讲解:https://www.cnblogs.com/lulu638/p/4340703.html 2.constant constant属性配置,可配置的属性可以参考def ...
- 1. volatale 关键字 -内存可见性
package com.gf.demo01; /** * 一.volatile 关键字:但多个线程进行操作共享数据时,可以保证内存中数据可见性. * */ public class TestVolat ...
- .NET 发送电子邮件
static void Main(string[] args) { ///先引入 using System.Net.Mail; ///发送邮件 using (MailMessage mailMessa ...
- SSH整合jar包分享及登陆实例详解
相关jar包分享:struts2+hibernate3+spring3 以及aop ,mysql,以及整合必须包. 链接:https://pan.baidu.com/s/1nCHmSsKU0hiV8D ...
- Debug始于71年前
摘要: 纪念Grace Hopper发现世界上第一个计算机BUG! 1947年9月9日,Grace Hopper的计算科学团队在哈佛的哈弗Mark II电脑运行程序时遇到一个技术故障.她在发生故障的M ...
- 事件处理程序 (DOM0级)
DOM0事件处理程序 每个元素都有自己的事件处理程序属性,那么直接获取对象,然后在对象上设置事件处理程序属性. 1:获取节点对象引用 2:在事件成员上设置处理函数,这时函数内部this指向节点对象. ...