MySQL Server日志被大量成功登录记录占满,如何分离该类日志?
成功登录日志分离最佳处理方案
下面根据不同使用场景提供可落地的实现方案:
方案1:通过日志服务内置规则实时分流(首推,无性能损耗)
适配使用rsyslog、syslog-ng等系统标准日志服务,或者数据库自带日志模块的场景:
- 系统日志服务配置(以rsyslog为例):
- 新建规则配置文件
/etc/rsyslog.d/10-login-filter.conf,按照你日志的实际特征填写匹配规则,示例如下:
# 匹配SQL服务用户的成功登录日志,写入独立文件 :msg, contains, "Login Success: sql_svc_user" /var/log/sql_service_login.log # 匹配远端连接服务用户的成功登录日志,写入独立文件 :msg, contains, "Login Success: remote_conn_user" /var/log/remote_conn_login.log # 若不需要上述日志继续写入原错误日志,添加下面的终止规则 & stop- 重启rsyslog服务生效:
systemctl restart rsyslog
- 新建规则配置文件
- SQL服务日志配置:
调整数据库日志输出级别,将成功登录事件从错误日志中剥离,归类到独立的通用日志/连接日志文件中。例如MySQL可配置general_log单独存储所有连接请求,同时将错误日志级别调整为只记录警告、错误级别的事件。
方案2:日志轮转时后置拆分(适合不想修改现有日志输出规则的场景)
通过logrotate的钩子脚本在日志轮转时自动拆分内容:
- 编辑对应日志的logrotate配置文件,添加预处理逻辑:
/var/log/error.log { # 原有轮转配置保留,新增下面的预处理规则 prerotate # 提取成功登录记录到独立归档文件 grep -E "Login Success.*(sql_svc_user|remote_conn_user)" $1 >> /var/log/archive/login_history.log # 从原错误日志中删除对应记录 sed -i "/Login Success.*(sql_svc_user|remote_conn_user)/d" $1 endscript }
方案3:排查时临时过滤(零配置,适合临时排查场景)
不需要修改任何服务配置,查看日志时直接通过命令过滤不需要的内容:
# 查看错误日志时自动跳过所有成功登录记录 grep -v -E "Login Success.*(sql_svc_user|remote_conn_user)" /var/log/error.log # 实时滚动查看最新日志时过滤 tail -f /var/log/error.log | grep -v -E "Login Success.*(sql_svc_user|remote_conn_user)"
内容的提问来源于stack exchange,提问作者edsobo
相关产品推荐
相关产品推荐

