Docker-Compose部署MariaDB:审计日志无法输出至syslog问题排查
1. 容器内缺少Syslog服务(核心问题)
默认的MariaDB官方镜像没有预装syslog守护进程(比如rsyslog、syslog-ng),哪怕你配置了server_audit_output_type=syslog,容器内没有接收syslog的服务,日志根本无法生成。
解决方法二选一:
方案A:挂载主机的syslog socket到容器
修改docker-compose.yaml的volumes部分,添加主机的/dev/log挂载:volumes: - ./mysql-conf:/etc/mysql/conf.d - ./data/mysql:/var/lib/mysql - ./data/mysql/log/audit:/var/log/mysql - /dev/log:/dev/log # 新增:挂载主机syslog socket配置后,MariaDB容器会把审计日志发送到主机的syslog服务,你可以在主机的
/var/log/syslog(Debian/Ubuntu)或/var/log/messages(CentOS/RHEL)里,通过搜索server_audit关键词查看审计日志。方案B:在容器内安装并启动syslog服务
若不想依赖主机syslog,可自定义Dockerfile,基于mariadb:10.11.6安装rsyslog:FROM mariadb:10.11.6 RUN apt-get update && apt-get install -y rsyslog && rm -rf /var/lib/apt/lists/* CMD ["bash", "-c", "rsyslogd && docker-entrypoint.sh --transaction-isolation=READ-COMMITTED --binlog-format=ROW"]然后修改docker-compose.yaml使用自定义镜像:
services: db: container_name: db build: . # 替换原image行,使用本地构建的镜像 # 其余配置不变
2. 清理冗余配置项
你的my.cnf里包含了一堆针对文件输出的配置(server_audit_file_*开头的项),既然用syslog输出,这些配置完全没用,可以删除,避免混淆:
plugin_load_add = server_audit server_audit=FORCE_PLUS_PERMANENT server_audit_logging=ON server_audit_output_type=syslog server_audit_events=connect,query server_audit_query_log_limit=10000
3. 验证审计插件是否正确加载
进入容器执行SQL命令,检查插件状态:
docker exec -it db mysql -uroot -ppassword -e "SHOW PLUGINS LIKE 'server_audit';"
如果输出中Status列是ACTIVE,说明插件加载正常;如果是DISABLED或无结果,检查plugin_load_add配置是否正确,或者容器内是否存在server_audit.so插件文件(路径通常是/usr/lib/mysql/plugin/server_audit.so)。
4. 检查Syslog日志接收配置(针对方案A)
如果挂载主机syslog后还是看不到日志,检查主机的syslog配置是否允许接收容器的日志:
- Debian/Ubuntu:默认rsyslog配置一般没问题,直接查看
/var/log/syslog,搜索server_audit关键词。 - CentOS/RHEL:查看
/var/log/messages,同样搜索server_audit。
内容的提问来源于stack exchange,提问作者bullmaca

