问题描述
我成功运行了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>