使用rsyslog输出Docker日志


概述

如何使用rsyslog输出Docker日志。

相关

  • 使用logrotate管理任意日志

环境

  • CentOS的7.7
  • rsyslog 8.24.0-41.el7_7.2

Docker设置

在Docker或docker-compose中,指定以下参数,以便将日志传递到rsyslog。
确保将字符串This is a example.输出到日志。

<表格>

设置

Docker

docker-compose


<身体>

使用syslog

--log-driver = syslog

logging.driver

日志类型分类

--log-opt syslog-facility = {设备名称}

logging.options.syslog-facility

用于日志和文件名的名称

--log-opt标记= {任意字符串}

logging.options.tag


对于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}}

<表格>

变量

含义


<身体>

{{.Name}}

容器名称

{{.ID}}

容器ID


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

<表格>

变量

含义


<身体>

$模板

使用模板的声明

DockerLogs

模板名称。任何字符串都可以

%程序名%

输出日志的程序名称

$程序名

输出日志的程序名称

$ syslogfacility-text

--log-opt Syslog-facility或logging.options.syslog-facility 中指定的字符串


其他变量请参见下文
rsyslog.conf语法

1
if $syslogfacility-text == 'daemon' and $programname contains 'sample-app' then -?DockerLogs

仅当

$syslogfacility-textdaemon并且$programname包含字符串sample-app时才记录日志。
$syslogfacility-text必须与--log-opt syslog-facilitylogging.options.syslog-facility组合,并且$programname必须与--log-opt taglogging.options.tag组合。

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

sample-app/{コンテナ名}/{コンテナID}部分是在--log-opt taglogging.options.tag中指定的字符串。

/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

"/var/log/docker/%syslogtag:R,ERE,1,FIELD:sample-app/sample-container/(.*)\[(.*)\]:--end%.log"部分的说明。

<表格>

变量

含义


<身体>

/ var / log / docker /

输出日志文件的位置

%syslogtag%

--log-opt标记或logging.options.tag中指定的字符串。它是要使用正则表达式提取的目标字符串。

R

使用不匹配时,这里是R

ERE

正则表达式类型。 BRE的ERE。 ERE是BRE的扩展模式。通常选择此项。

1

子比赛编号

不匹配模式规范。参见下面的框架。

sample-app/sample-container/(.*)\[(.*)\]:

从" R"(在此情况下为%syslogtag%)之前的字符串中提取具有此正则表达式的字符串,并在文件名中使用它

--end%.log

确保在末尾写上


在此设置的情况下,将从具有正则表达式sample-app/sample-container/(.*)\[(.*)\]:%syslogtag%中提取的字符串用作文件名。

关于无匹配模式

指定Mode的正则表达式不匹配时要返回的默认字符串。
每个模式返回的字符串如下,但是,如果指定了FIELD,则返回所有以正则表达式为目标的字符串。 (在此情况下为%Syslogtag%)

<表格>

模式

返回


<身体>

DFLT

\\" **没有匹配** \\"

空白

\\"(空字符串)

\\" 0 \\"

FIELD

原始字段的全部内容


来源:属性替换器不匹配模式

使用此FIELD正则表达式

时的行为

%syslogtag% = sample-app/sample-container/f76f6af73829[27081]

使用以下正则表达式从

中提取。

1
sample-app/sample-container/(.*)\[(.*)\]:

由于

子匹配指定1,因此仅提取第一个(.*)
即,提取容器ID f76f6af73829

结果,以下是文件名。

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

sample-app/{コンテナ名}/{コンテナID}部分是在--log-opt taglogging.options.tag中指定的字符串。

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中正则表达式的一部分与sample-app_nomatch匹配。

/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

sample-app/{コンテナ名}/{コンテナID}部分是在--log-opt taglogging.options.tag中指定的字符串。

1
Feb 18 17:21:23 example-hostname sample-app/sample-container/de64dadc7e97[27081]: This is a example

由于

正则表达式不匹配并且使用了FIELD,因此%syslogtag%的内容按原样成为文件名。
如上所述,在DFLT的情况下,文件名是**NO MATCH**.log,在ZERO的情况下,0.log是文件名。如果是BLANK,则不输出日志文件。

参考

  • [Docker Compose]将日志输出到每个容器的日志文件
  • 如何将rsyslog与宏和模板一起使用
  • rsyslog.conf语法
  • 如何在Rsyslog中编辑传出消息?
  • 属性替换器不匹配模式