利用 elk 处理 percona 审计日志-凯发app官方网站

凯发app官方网站-凯发k8官网下载客户端中心 | | 凯发app官方网站-凯发k8官网下载客户端中心
  • 博客访问: 1257811
  • 博文数量: 1140
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 11688
  • 用 户 组: 普通用户
  • 注册时间: 2018-03-07 16:26
个人简介

linux学习小标兵,专注linux资讯分享,技术文章分享

文章分类

全部博文(1140)

文章存档

2023年(97)

2022年(285)

2021年(265)

2020年(248)

2019年(213)

2018年(32)

我的朋友
最近访客
相关博文
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·

分类: linux

2023-04-12 22:09:45

导读 percona server为 mysql 数据库服务器进行了改进,在功能和性能上较 mysql 有着很显著的提升。该版本提升了在高负载情况下的 innodb 的性能、为 dba 提供一些非常有用的性能诊断工具;另外有更多的参数和来控制服务器行为
前提

1、有强烈的审计需求。

2、能允许10%-15%左右的性能损失。

3、有强烈的对数据库操作实时查看需求(一般都是为了领导要求)。

logstash 比较坑的配置
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 模块解析相关日志文件报错:

>>> json.loads(json_line)
traceback (most recent call last):
  file "", line 1, in 
  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数据了,

{banned}最佳终logstash只能报错并将整个message记录到 elasticsearch 中

解决办法

解决办法就是把这些字符替换掉。如下 logstash 配置文件

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) 字符替换成空格,要注意的一点{banned}最佳终显示的sql和原来的有所差别。

这种方法有点不灵活如果sql语句中还有遇到一些json不能解析的字符又要进行处理。

>>朋友们如果有更好的方法也告知一声哈!<<<

还不能笑到{banned}最佳后

刚开始以为这一切都万事大吉了。其实还有个一坑就是在使用 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")

{banned}最佳终配置文件如下
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 中正确显示。

祝大家好运。

阅读(852) | 评论(0) | 转发(0) |
0

上一篇:

下一篇:

给主人留下些什么吧!~~
")); function link(t){ var href= $(t).attr('href'); href ="?url=" encodeuricomponent(location.href); $(t).attr('href',href); //setcookie("returnouturl", location.href, 60, "/"); }
网站地图