因此,基本体系结构是Fluentd DaemonSet,遵循this blog post从pod设置中删除Docker日志,最后使用these resources。
我在集群中运行了多个Pod和服务,我无法控制它们的日志格式。但是,我确实可以控制我正在使用的服务,并且我希望它们使用与Logstash(键值)兼容的JSON输出格式。
现在,我不知道是否可以通过此额外步骤选择性地解析某些日志,因为某些服务将没有这些日志格式。当然我希望Elasticsearch / Kibana可以访问此数据以进行数据可视化。
找到特定的Fluentd配置on this file
非常感谢您的帮助/建议
所以这里的问题是,通过以下步骤提取了JSON日志
# JSON Log Example
{"log":"2014/09/25 21:15:03 Got request with path wombat\n", "stream":"stderr", "time":"2014-09-25T21:15:03.499185026Z"}
正在使用tail
类型从每个节点中的docker日志中读取日志:
<source>
@id fluentd-containers.log
@type tail
path /var/log/containers/*.log
pos_file /var/log/es-containers.log.pos
tag raw.kubernetes.*
read_from_head true
<parse>
@type multi_format
<pattern>
format json
time_key time
time_format %Y-%m-%dT%H:%M:%S.%NZ
</pattern>
<pattern>
format /^(?<time>.+) (?<stream>stdout|stderr) [^ ]* (?<log>.*)$/
time_format %Y-%m-%dT%H:%M:%S.%N%:z
</pattern>
</parse>
</source>
Kubernetes metadata plugin添加额外的数据
{
"log":"2014/09/25 21:15:03 Got request with path wombat\n",
"stream":"stderr",
"time":"2014-09-25T21:15:03.499185026Z",
"kubernetes": {
"namespace": "default",
"pod_name": "synthetic-logger-0.25lps-pod",
"container_name": "synth-lgr"
},
"docker": {
"container_id": "997599971ee6366d4a5920d25b79286ad45ff37a74494f262e3bc98d909d0a7b"
}
}
但是,我有一个类似于以下内容的日志:
{"method":"GET","path":"/","format":"html","controller":"HomeController","action":"index","status":200,"duration":1922.45,"view":1912.5,"db":883.41,"request_ip":"127.0.0.1","@timestamp":"2018-09-20T16:43:17.322Z","@version":"1","message":"[200] GET / (HomeController#index)"}
问题是,整个日志将被“堵塞”在“日志”字段中,如您在上面发布的第一个屏幕截图中所见。我猜想使用kubernetes元数据将是这样的:
{
"log":"{"method":"GET","path":"/","format":"html","controller":"HomeController","action":"index","status":200,"duration":1922.45,"view":1912.5,"db":883.41,"request_ip":"127.0.0.1","@timestamp":"2018-09-20T16:43:17.322Z","@version":"1","message":"[200] GET / (HomeController#index)"}",
"stream":"stdout",
"time":"2014-09-25T21:15:03.499185026Z",
"kubernetes": {
"namespace": "default",
"pod_name": "rails-pod",
"container_name": "rails-app"
},
"docker": {
"container_id": "801599971ee6366d4a5921f25b79286ad45ff37a74494f260c3bc98d909d0a7b"
}
}
我正在寻找一种将数据过滤/解析/提取成类似以下内容的方法:
{
"rails-log": {
"method": "GET",
"path": "/",
"format": "html",
"controller": "HomeController",
"action": "index",
...
"message": "[200] GET / (HomeController#index)"
},
"stream":"stdout",
"time":"2014-09-25T21:15:03.499185026Z",
"kubernetes": {
"namespace": "default",
"pod_name": "rails-pod",
"container_name": "rails-app"
},
"docker": {
"container_id": "801599971ee6366d4a5921f25b79286ad45ff37a74494f260c3bc98d909d0a7b"
}
}
我认为可以通过解析/过滤来实现,我只是不确定如何将其放入流利的配置中(complete current configs found here)
在Kubernetes插件执行后(将kubernetes特定的元数据添加到“有效负载”中),我可以通过使用过滤器kubernetes.labels.app is '<service_name>'
进行查询来选择(在Kibana中)来自特定服务的日志。因此,这使我相信,有一种方法可以将“ log”字段进行“条件提取/转换”为我可以使用的东西。
答案 0 :(得分:0)
您可以尝试使用流利的here中的rails配置。
对于其他类型的日志,请相应地修改format
。取决于正则表达式。例如:
format /^(?<severity>\w)(?<time>\d{4} [^\s]*)\s+(?<pid>\d+)\s+(?<source>[^ \]]+)\] (?<message>.*)/
然后您可以修改Kubernetes的ConfigMap
kubectl -n kube-system edit configmap luentd-es-config-v0.1.5
希望有帮助!