跳转至

Syslog 采集

Syslog 采集分成两种,一种是已经文本化的日志,一般位于 /var/log/syslog/var/log/messages,这种我们可以直接通过配置 logging 采集器来采集。一种是 Systemd Journal 这种是二进制文件,通常位于 /run/log/journal/var/log/journal,而文本化的日志通常是通过 rsyslog 服务从 Journald 里读取出来转成的文本。

本文主要描述如果通过 DataKit 直接采集 Journald 的二进制日志,其基本流程如下:

sequenceDiagram
autonumber

box Linux 服务器
participant journald as Journald
participant rsyslog as rsyslog Service
end

participant dk as DataKit

rsyslog ->> journald: 读取二进制 syslog
rsyslog ->> rsyslog: 转换成纯文本日志
rsyslog ->> dk: 发送到 TCP/UDP 日志服务

前置条件

  • 安装 rsyslog 服务
  • 安装 DataKit

配置步骤

  • 开启 DataKit 日志采集器,同时启用其 TCP/UDP 接收端口

    /usr/loca/datakit/conf.d/logging.conf
    # Socket log reception, supports tcp/udp protocols
    # Recommended to use internal network ports for security
    sockets = [
      "tcp://0.0.0.0:9540",  # TCP listening port
      # Or use UDP
      #"udp://0.0.0.0:9541",  # UDP listening port
    ]
    source = "journald-syslog" # 此处可指定任意自定义 source,默认值为 default 
    
  • 重启 DataKit

主机 Journald 日志采集

  • 编辑 /etc/rsyslog.conf(也可在 /etc/rsyslog.d/ 下新建 forward-to-datakit.conf
  • 添加转发规则:

    /etc/rsyslog.d/forward-to-datakit.conf
    # 转发所有日志 (*.*) 到远程 IP 的 端口
    # 一个 @ 代表 UDP,两个 @@ 代表 TCP
    
    # TCP 转发示例
    *.* @@0.0.0.0:9540
    
    # UDP 转发示例
    *.* @0.0.0.0:9541
    

    此处 UDP/TCP 只开启其一即可,下文都以 TCP 为例。

  • 重启 rsyslog:systemctl restart rsyslog

Kubernetes Node Journald 日志采集

如果是 Kubernetes 中收集 Node 的 Journald 二进制日志,我们可以将日志发送给当前 Daemonset DataKit(配置跟上面一样)。此时我们需要通过 ConfigMap 挂载一个 logging.conf 采集器,且开通 TCP/UDP 日志接收配置。

  • 需放行 DataKit 特定的日志接收端口,将其端口映射到 Node 上(如下 TCP/UDP 端口可选其一):

    apiVersion: v1
    kind: Service
    metadata:
      name: datakit-service
      namespace: datakit
    spec:
      selector:
        app: daemonset-datakit
      ports:
        - name: tcp-logging
          protocol: TCP
          port: 9540
        - name: udp-logging
          protocol: UDP
          port: 9541
    
  • 将 rsyslog 的转发地址改成 DataKit service 地址:

    /etc/rsyslog.d/forward-to-datakit.conf
    # 转发所有日志 (*.*) 到远程 IP 的 端口
    # 一个 @ 代表 UDP,两个 @@ 代表 TCP
    
    # TCP 转发示例
    *.* @@0.0.0.0:9540
    
    # UDP 转发示例
    #*.* @0.0.0.0:9541
    
  • 重启 rsyslog:systemctl restart rsyslog

采集效果

如果 DataKit 采集到了数据,在命令 datakit monitor 中会有类似如下展示:

|                  Source│Cat│Feeds│   P90Lat│P90Pts│Filtered│           LastFeed│       AvgCost│Errors
|socketLog.journal-syslog│ L │   2 │104.138µs│  2   │      0 │5m43.891165045s ago│      -       │

此处 journal-syslog 即采集器中配置的 source 值。

更多格式化处理

默认情况下,DataKit 采集到 Journald 格式可能如下:

<14>1 2024-03-19T15:53:04.391+0800 host-name app-name 12345 00000000 my-message-id This is the log message

其中已经包含了日志时间、主机名、进程等信息,但它不便于 Pipeline 提取,我们可以设置 rsyslog,通过配置 JSON 模版来结构化日志输出。如下是一个 JSON 配置示例,根据实际情况,大家可以灵活配置此处的 JSON 格式以及对应的 Pipeline 处理。

  • /etc/rsyslog.conf 增加如下模版:

    /etc/rsyslog.conf
    # 定义一个名为 "JsonFormat" 的模板
    template(name="JsonFormat" type="list") {
        # JSON 开始
        constant(value="{")
    
        # 1. 时间字段 (key: time)
        # dateFormat="rfc3339" 输出格式如: 2026-02-02T08:05:00Z
        constant(value="\"time\":\"")
        property(name="timereported" dateFormat="rfc3339")
        constant(value="\",")
    
        # 2. 主机名字段 (key: host)
        constant(value="\"host\":\"")
        property(name="hostname")
        constant(value="\",")
    
        # 3. 程序/服务名称 (key: app) - 可选,建议加上方便区分是 kubelet 还是 kernel
        constant(value="\"app\":\"")
        property(name="programname")
        constant(value="\",")
    
        # 4. 日志级别 (key: level) - 可选
        constant(value="\"level\":\"")
        property(name="syslogseverity-text")
        constant(value="\",")
    
        # 5. 消息正文 (key: message)
        # format="json" 非常重要!它会自动转义消息里的双引号,防止 JSON 格式破损
        constant(value="\"message\":\"")
        property(name="msg" format="json")
        constant(value="\"")
    
        # JSON 结束并换行
        constant(value="}\n")
    }
    
  • 转发规则设置: 追加 JSON 格式的转发

    /etc/rsyslog.d/forward-to-datakit.conf
    *.* @@0.0.0.0:9540;JsonFormat
    
  • 通过 Pipeline 的 load_json 函数即可方便的处理这种格式的日志。将如下 pipeline 放到 DataKit 安装目录的 pipeline/logging/ 目录下,其文件名和上面配置的 source 字段一致:

    /usr/loca/datakit/pipeline/logging/journal-syslog.p
    journald_log=load_json(_)
    
    drop_origin_data()
    
    # 设置一组 tag
    pt_kvs_set("host", journald_log["host"], true) 
    pt_kvs_set("app", journald_log["app"], true)
    pt_kvs_set("status", journald_log["level"])
    pt_kvs_set("message", journald_log["message"])
    pt_kvs_set("time", journald_log["time"])
    default_time("time")
    

    datakit monitor -MP 中可看到类似如下的 Pipeline 处理状态:

    ║          Script│Cat│Namespace│TotalPts│DropPts│ErrPts│           PLUpdate│ AvgCost  ║
    ║journal-syslog.p│  L│  default│     12 │   -   │  -   │8m16.719853556s ago│65.548µs  ║
    

文档评价

文档内容是否对您有帮助? ×