概述
如何使用rsyslog输出Docker日志。
相关
- 使用logrotate管理任意日志
环境
- CentOS的7.7
- rsyslog 8.24.0-41.el7_7.2
Docker设置
在Docker或docker-compose中,指定以下参数,以便将日志传递到rsyslog。
确保将字符串
<表格>
tr>
header>
<身体>
tr>
tr>
tr>
tbody>
table>
对于docker命令
1 2 3 4 5 6 7 | $ sudo docker run --rm \ --name sample-container \ --log-driver=syslog \ --log-opt syslog-facility=daemon \ --log-opt tag=sample-app/{{.Name}}/{{.ID}} \ -it ${Dockerイメージ名} \ /bin/bash -c 'echo "This is a example."' |
对于docker-compose
docker-compose.yml
1 2 3 4 5 6 7 8 9 10 | version: '3' services: sample-container: image: sample-image command: 'echo "This is a example."' logging: driver: syslog options: syslog-facility: daemon tag: sample-app/{{.Name}}/{{.ID}} |
<表格>
tr>
header>
<身体>
tr>
tr>
tbody>
table>
rsyslog设置
使用rsyslog模板功能指定日志文件名。
确保日志文件名为/var/log/docker/sample-app_date.log。
/etc/rsyslog.d/10-docker.conf
/etc/rsyslog.d/10-docker.conf
1 2 3 4 | $template DockerLogs, "/var/log/docker/%programname%_%$year%%$month%%$day%.log" if $syslogfacility-text == 'daemon' and $programname contains 'sample-app' then -?DockerLogs & stop |
<表格>
tr>
header>
<身体>
tr>
tr>
tr>
tr>
tr>
tbody>
table>
其他变量请参见下文
rsyslog.conf语法
1 | if $syslogfacility-text == 'daemon' and $programname contains 'sample-app' then -?DockerLogs |
仅当
rsyslog重新启动
修改docker.conf后需要
/etc/rsyslog.d/10-restart。
1 | $ sudo systemctl restart rsyslog |
输出日志
执行Docker或docker-compose。
实际输出的日志。
-
格式:
/var/log/docker/{%programname%}_{%$year%%$month%%$day%}.log -
例如):
/var/log/docker/sample-app_20200218.log
/var/log/docker/sample-app_20200218.log
1 | Feb 18 17:03:19 example-hostname sample-app/sample-container/{コンテナID}[{dockerdのプロセスID}]: This is a example. |
仅提取容器ID并将其用作日志文件名
如何使用nomatch-Mode提取字符串并在文件名中使用它。
使用此方法,尝试仅使用容器ID作为日志文件名。
rsyslog设置
/etc/rsyslog.d/10-在docker.conf中进行如下设置。
/etc/rsyslog.d/10-docker.conf
1 2 3 4 | $template DockerLogs, "/var/log/docker/%syslogtag:R,ERE,1,FIELD:sample-app/sample-container/(.*)\[(.*)\]:--end%.log" if $syslogfacility-text == 'daemon' and $programname contains 'sample-app' then -?DockerLogs & stop |
<表格>
tr>
header>
<身体>
tr>
tr>
tr>
tr>
tr>
tr>
tr>
tr>
tbody>
table>
在此设置的情况下,将从具有正则表达式
关于无匹配模式
指定Mode的正则表达式不匹配时要返回的默认字符串。
每个模式返回的字符串如下,但是,如果指定了
<表格>
tr>
header>
<身体>
tr>
tr>
tr>
tr>
tbody>
table>
来源:属性替换器不匹配模式
使用此FIELD正则表达式
时的行为
使用以下正则表达式从
中提取。
1 | sample-app/sample-container/(.*)\[(.*)\]: |
由于
子匹配指定
即,提取容器ID
结果,以下是文件名。
1 | /var/log/docker/f76f6af73829.log |
rsyslog重新启动
修改docker.conf后需要
/etc/rsyslog.d/10-restart。
1 | $ sudo systemctl restart rsyslog |
输出日志
执行Docker或docker-compose。
使用此设置实际输出的日志。
-
格式:
/var/log/docker/sample-app/{コンテナ名}/{コンテナID}.log -
例如):
/var/log/docker/f76f6af73829.log
1 | Feb 18 17:21:23 example-hostname sample-app/sample-container/f76f6af73829[27081]: This is a example. |
如果不匹配正则表达式
rsyslog设置
尝试不将
/etc/rsyslog.d/10-docker.conf中正则表达式的一部分与
/etc/rsyslog.d/10-docker.conf
1 2 3 4 | $template DockerLogs, "/var/log/docker/%syslogtag:R,ERE,1,FIELD:sample-app_nomatch/sample-container/(.*)\[(.*)\]:--end%.log" if $syslogfacility-text == 'daemon' and $programname contains 'sample-app' then -?DockerLogs & stop |
rsyslog重新启动
修改docker.conf后需要
/etc/rsyslog.d/10-restart。
1 | $ sudo systemctl restart rsyslog |
输出日志
执行Docker或docker-compose。
使用此设置实际输出的日志。
-
格式:
/var/log/docker/sample-app/{コンテナ名}/{コンテナID}[{dockerdのプロセスID}].log -
例如):
/var/log/docker/sample-app/sample-container/de64dadc7e97\[27081\]\:.log
1 | Feb 18 17:21:23 example-hostname sample-app/sample-container/de64dadc7e97[27081]: This is a example |
由于
正则表达式不匹配并且使用了
如上所述,在
参考
- [Docker Compose]将日志输出到每个容器的日志文件
- 如何将rsyslog与宏和模板一起使用
- rsyslog.conf语法
- 如何在Rsyslog中编辑传出消息?
- 属性替换器不匹配模式