流利的Kubernetes DaemonSet选择性地解析不同的日志

时间:2018-09-19 22:47:02

标签: elasticsearch logging kubernetes kibana fluentd

因此,基本体系结构是Fluentd DaemonSet,遵循this blog post从pod设置中删除Docker日志,最后使用these resources

我在集群中运行了多个Pod和服务,我无法控制它们的日志格式。但是,我确实可以控制我正在使用的服务,并且我希望它们使用与Logstash(键值)兼容的JSON输出格式。

现在,我不知道是否可以通过此额外步骤选择性地解析某些日志,因为某些服务将没有这些日志格式。当然我希望Elasticsearch / Kibana可以访问此数据以进行数据可视化

示例JSON格式的日志(已部署Rails应用程序): enter image description here

示例非JSON格式的日志(CI / CD服务): enter image description here

找到特定的Fluentd配置on this file

非常感谢您的帮助/建议

编辑1:提供了更多详细信息

所以这里的问题是,通过以下步骤提取了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”字段进行“条件提取/转换”为我可以使用的东西。

1 个答案:

答案 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

希望有帮助!