用户登录
用户注册

分享至

利用 ELK 处理 Percona 审计日志

  • 作者: 污力胸毛
  • 来源: 51数据库
  • 2022-09-21
导读 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 "<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 配置文件

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不能解析的字符又要进行处理。

软件
前端设计
程序设计
Java相关