首页 > 解决方案 > 如何在 Docker AWS 日志驱动程序的 docker run 命令中添加 file_fingerprint_lines 选项作为 --log-opt 选项

问题描述

我在 CoreOS AWS 实例上运行我的 docker 容器,并为 docker 容器启用了 aws 日志驱动程序。下面给出的是我的 docker 容器运行命令。

docker run  --log-driver=awslogs --log-opt awslogs-region=ap-southeast-1 --log-opt awslogs-group=stagingUrlMapperLogs --log-opt awslogs-datetime-format='\[%%b %%d, %%Y %%H:%%M:%%S\]' --log-opt tag="{{.Name}}/{{.ID}}" --net=host --name url-mapper url-mapper-example:latest

问题是在 AWS CloudWatch 端的某个随机时间段(1-2 天)之后,没有记录新的日志事件。在做了一些研究之后,我在 AWS 开发者论坛上发现了这个问题。它说在 CloudWatch 配置中添加file_fingerprint_lines选项将解决该问题。但是我没有找到任何资源来解释如何使用 docker run 命令设置 file_fingerprint_lines 命令。

注意 - 我在 AWS autosacaling 组中运行我的服务器,该组连接到启动配置,所以每次我扩大规模时,新服务器都会随着容器在其上运行而启动。

标签: amazon-web-servicesdockercoreosamazon-cloudwatchlogs

解决方案


“但我没有找到任何资源来解释如何使用 docker run 命令设置 file_fingerprint_lines 命令。”

我认为您必须在 CloudWatch Logs 代理配置文件中进行设置:

来自Amazon CloudWatch 文档

file_fingerprint_lines

指定用于标识文件的行范围。有效值为一个数字或两个用短划线分隔的数字,例如“1”、“2-5”。默认值为'1',因此第一行用于计算指纹。指纹行不会发送到 CloudWatch Logs,除非所有指定行都可用

但是,我认为有趣的一点就在这里:

支持哪些类型的文件轮换?

支持以下文件轮换机制:

使用数字后缀重命名现有日志文件,然后重新创建原始的空日志文件。例如,/var/log/syslog.log 被重命名为 /var/log/syslog.log.1。如果 /var/log/syslog.log.1 在之前的轮换中已经存在,则将其重命名为 /var/log/syslog.log.2。

创建副本后在原地截断原始日志文件。例如,/var/log/syslog.log 被复制到 /var/log/syslog.log.1 并且 /var/log/syslog.log 被截断。这种情况下可能会丢失数据,因此在使用这种文件轮换机制时要小心。

创建一个与旧文件具有共同模式的新文件。例如,保留 /var/log/syslog.log.2014-01-01 并创建 /var/log/syslog.log.2014-01-02。

文件的指纹(源 ID)是通过对日志流密钥和文件内容的第一行进行散列计算得出的。要覆盖此行为,可以使用file_fingerprint_lines选项。当文件轮换发生时,新文件应该有新内容,旧文件不应该附加内容;代理在完成读取旧文件后推送新文件。

并且,如何覆盖它:

您可以有多个 [logstream] 部分,但每个部分必须在配置文件中具有唯一名称,例如 [logstream1]、[logstream2] 等。[logstream] 值与日志文件中的第一行数据一起定义了日志文件的标识。

[general]
state_file = value
logging_config_file = value
use_gzip_http_content_encoding = [true | false]

[logstream1]
log_group_name = value
log_stream_name = value
datetime_format = value
time_zone = [LOCAL|UTC]
file = value
file_fingerprint_lines = integer | integer-integer
multi_line_start_pattern = regex | {datetime_format}
initial_position = [start_of_file | end_of_file]
encoding = [ascii|utf_8|..]
buffer_duration = integer
batch_count = integer
batch_size = integer

[logstream2]
...

推荐阅读