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 端口可选其一):
-
将 rsyslog 的转发地址改成 DataKit service 地址:
-
重启 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 格式的转发
-
通过 Pipeline 的
load_json函数即可方便的处理这种格式的日志。将如下 pipeline 放到 DataKit 安装目录的 pipeline/logging/ 目录下,其文件名和上面配置的source字段一致:/usr/loca/datakit/pipeline/logging/journal-syslog.pjournald_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 处理状态: