将客户端唯一记录添加到日志事件中,使您流利例如,使用过滤器

问题描述

我成功运行了dockerized流利的TCP日志记录!含义:有 使用稍微修改的远程python容器 userName发送一些JSON到- 它实际上到达了那里,看起来像这样:

logging.handlers.SocketHandler

我有多个这样的python容器,想流畅地添加一些 每个日志事件的源ID类型。 Reading the docs让我给2020-08-31T09:06:31+00:00 paws.tcp {"service_uuid":"paws_log","loglvl":"INFO","file":"paws_log.paws_log","line":59,"msg":"Ping log line #2"} 机制的机会。导致以下配置代码段,其中新增了 filter -> record阻止

filter

我在这里有两个问题:

  • 如果我将<source> @type tcp @label stream_paws @id paws_tcp tag paws.tcp port 5170 bind 0.0.0.0 # https://docs.fluentd.org/parser/regexp <parse> @type regexp expression /^(?<service_uuid>[a-zA-Z0-9_-]+): (?<logtime>[^\s]+) (?<loglvl>[^\s]+) \[(?<file>[^\]:]+):(?<line>\d+)\]: (?<msg>.*)$/ time_key logtime time_format %H:%M:%S types line:integer </parse> </source> # Add meta data fluentd side. # https://docs.fluentd.org/deployment/logging <filter **> # << Does NOT seem to work if kept outside the label-block! Inside is fine. @type record_transformer <record> host "#{Socket.gethostname}" </record> </filter> <label stream_paws> <match paws.tcp> @type file @id output_paws_tcp path /fluentd/log/paws/data/tcp.*.log symlink_path /fluentd/log/paws/tcp.log </match> </label> 块放在filter块中,则上述配置有效。但这是我不想做的,因为我希望过滤器在全局范围内起作用。 label指令可能会在此处提供解决方法。有什么更好的吗?
  • 我怀疑@include在流利的服务器上产生了信息。但是,我想要 client 上的内容。理想情况下,包括一些在Docker容器级别上唯一的ID(可能是容器ID。但是,任何旧的客户端唯一的uuid都可以)。您知道流利的这种财产吗?

解决方法

如果您使用的是fluentd docker日志记录驱动程序,它将已经向每个日志记录添加了容器元数据(包括id): https://docs.docker.com/config/containers/logging/fluentd/

如果我将filter-block放在label-block内,则上述配置有效。但这是我不想做的,因为我希望过滤器在全局范围内起作用。 @include指令可能会在此处提供解决方法。有什么更好的吗?

通常在以下服务器上实现的全局过滤器:

<source>
...
</source>

<filter **> # filter globally
...
</filter>

<match tag.one>
...
</match>

<match tag.two>
...
</match>

<match **> # the rest
...
</match>

我怀疑“#{Socket.gethostname}”会在流利的服务器上产生信息。

正确,请参见:https://docs.fluentd.org/filter/record_transformer#example-configurations。当您还想跟踪哪个服务器处理了日志记录时,这很有用。

,

如果您正在使用kubernetes,则使用kubernetes元数据,它将在每个日志条目中添加pod的详细信息。

<filter kubernetes.**>
  @id filter_kubernetes_metadata
  @type kubernetes_metadata
</filter>

对于Docker

我以前并没有真正使用过流利的软件,所以在这里对抽象的回应表示歉意。但是..检查http://docs.fluentd.org/,我想您可能正在使用in_tail记录日志?从那里的示例看来,您可能想要将文件的路径输入到输入消息中:

path /path/to/file
tag foo.*

显然使用foo.path.to.file标记事件

您可能将http://docs.fluentd.org/articles/filter_record_transformer与enable_ruby一起使用。由此看来,您可能可以处理foo.path.to.file标记,并使用一些红宝石提取容器ID,然后解析出JSON文件。

例如,使用以下红宝石文件(例如foo.rb)进行测试

tag = 'foo.var.lib.docker.containers.ID.ID-json.log'
require 'json'; id = tag.split('.')[5]; puts JSON.parse(IO.read("/var/lib/docker/containers/#{id}/config.v2.json"))['image']

其中config.v2.json类似于:

{"image":"foo"}

将打印您

foo

Fluentd可能已经为您包括了json,所以也许您可以省略要求的“ json”;一点。然后,用流利的措词,也许您可​​以使用类似的

<filter>
  enable_ruby
  <record>
    container ${tag.split('.')[5]}
    image ${id = tag.split('.')[5]; JSON.parse(IO.read("/var/lib/docker/containers/#{id}/config.v2.json"))['image']}
  </record>
 </filter>

根据您的情况,您可以像下面这样使用

<filter raw.**>
  @type record_transformer
  enable_ruby
 <record>
    container ${id = tag.split('.')[5]; JSON.parse(IO.read("/var/lib/docker/containers/#{id}/config.v2.json"))["Name"][1..-1]}
     hostname "#{Socket.gethostname}"
 </record>
</filter>

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...