Build syslog server notes


有一些独立设备的日志需要采集,就找了一个比较小型的开源架构,初步是对比ELK\PLG,后面还是想着越简单越省事越好,就PLG了。

PLG是一套开源且成熟的日志监控系统,根据自己所使用的系统去下载对应的 Loki 和 Promtail 、grafana版本使用即可。

下面loki 和 grafana基于 v3.6.4 版本进行构建的 。

三者的架构图

核心的就这三个组件:
image

  • 采集 (Promtail): 作为 Agent 部署在各个节点上,发现日志目标,抓取日志内容,添加标签(Label),并发送给 Loki。

  • 存储 (Loki): 接收日志流,不进行全文索引,仅索引元数据标签(Labels)。日志数据以压缩的块(Chunk)存储,可以节省空间。

  • 查询 (Grafana): 用户在 Grafana 中通过 LogQL 语言查询存储在 Loki 中的日志,支持实时监控和报警。

还有一些配套的工具: LogCLI 和 Loki Canary:

  • LogCLI 允许您在命令行界面中运行 Loki 查询;
  • Loki Canary是一款用于审核 Loki 性能的工具。

Principle of operation

PLG 把不同的功能块都独立出来,可以单独部署、独立运行,组合不同的工具使用,解耦合性非常好。

Loki 并不像 Elasticsearch 那样对全文进行索引,而是借鉴了 Prometheus 的存储理念,采用索引数据 分离的机制

promtail以标签作为索引的配置:

  relabel_configs:
    - source_labels: ['__syslog_message_hostname']
      target_label: 'device_ip'  # 将设备 IP 提取为标签

其工作流程如下:

  1. 采集 (Promtail): 作为 Agent 部署在各个节点上,发现日志目标,抓取日志内容,添加标签(Label),并发送给 Loki。

  2. 存储 (Loki): 接收日志流,不进行全文索引,仅索引元数据标签(Labels)。日志数据以压缩的块(Chunk)存储,节省空间。

  3. 查询 (Grafana): 用户在 Grafana 中通过 LogQL 语言查询存储在 Loki 中的日志,支持实时监控和报警。


execute pack init and Install

我的环境是单机linux,上传了安装包的环境。下面记录一下安装过程,方便自己回顾吧。

loki

unzip loki-linux-amd64.zip
mv loki-linux-amd64 /opt//loki # 假设重命名并移动
chmod +x /opt/loki
cp loki-local-config.yaml /opt/loki/loki-local-config.yaml

config:
https://raw.githubusercontent.com/grafana/loki/v3.6.0/cmd/loki/loki-local-config.yaml

Promtail

安装过程和loki类似,配置好config就行。

config :
https://raw.githubusercontent.com/grafana/loki/main/clients/cmd/promtail/promtail-local-config.yaml


loki server start

前台开启测试
./loki-linux-amd64 -config.file=./loki-local-config.yaml

判断服务是否可用,检查HTTP API状态
通过web查看 http://localhost:3100/ready

  • 如果返回 ready,则表示服务完全正常。
  • 如果返回 not ready 或连接失败,则Loki尚未正常工作。
    如果是第一次启动,需要等待几分钟。

测试正常之后,可以后台开启
nohup ./loki -config.file=loki-local-config.yaml > loki.log 2>&1 &

promtail server start

前台启动:
./promtail-linux-amd64 -config.file=promtail-config.yaml

后台启动
nohup ./promtail-linux-amd64 -config.file=promtail-config.yaml > promtail.log 2>&1 &

报错:
GLIBC_2.32 not found
GLIBC_2.34 not found

针对 glibc 2.17(对应 CentOS 7 级别内核),建议尝试以下版本:
首选版本:v2.9.9
理由:根据社区反馈,v2.9.9 是在旧 Linux 系统上能够稳定运行的较新版本之一。
可以运行。

promtail of windows

没有其他linux版本了,只能先找个windows系统来先用。

也是下载,然后写好配置文件,启动
.\promtail-windows-amd64.exe --config.file=promtail-local-config.yaml

没有做 win服务 启动的话,需要后台窗口 挂着进程。

在 Windows 失败了,因为Promtail syslog 模块的代码里写死了严格检查,解析H3C-ips 的日志就报错,
猜测是无法解析H3C-IPS的特殊syslog格式导致。

H3C 非标准 RFC5424 格式 。

该版本不适合。


.deb grafana install

.deb 安装包,标准且简单的做法是使用 dpkg 命令安装。这种方式会自动将 Grafana 注册为系统服务,非常适合长期稳定运行。

dpkg -i grafana_12.3.2_21390657659_linux_amd64.deb

Command:
重载系统服务配置
sudo systemctl daemon-reload

启动 Grafana 服务
sudo systemctl start grafana-server

设置开机自启
sudo systemctl enable grafana-server

检查运行状态
sudo systemctl status grafana-server

登录与配置
访问地址:打开浏览器,输入:http://[IP]:3000
默认账号:用户名为 admin,初始密码也是 admin。
首次登录:系统会强制要求你修改密码。

关键路径说明 (DEB 安装版)
配置文件:/etc/grafana/grafana.ini (修改端口或域名在这里改)
数据存储:/var/lib/grafana (仪表盘和插件存在这里)
运行日志:/var/log/grafana (如果启动失败,去这里看报错)


.rpm grafana install

中标麒麟 (NeoKylin) 是基于 CentOS/Red Hat 开发的,因此它使用的是 rpm 软件包管理器。

pack download :
https://dl.grafana.com/grafana/release/12.3.2/grafana_12.3.2_21390657659_linux_amd64.rpm

在中标麒麟中,使用 yum 命令安装本地包是最佳实践,因为它会自动帮你处理依赖关系:
sudo yum localinstall grafana-enterprise-11.5.1-1.x86_64.rpm

安装完成会提示:
Complete!

Some bash:
启动
systemctl start grafana-server

查看状态
systemctl status grafana-server

开机自启
systemctl enable grafana-server


Grafana server start

Grafana 启动后,最重要的操作是将 Loki 添加为数据源,否则它无法读取 Promtail 采集到的日志。以下是标准配置流程:

  1. 登录与基础设置
    访问地址:默认地址通常为 http://localhost:3000
    用Chrome浏览器打开,其他浏览器会报错,不知道为什么。先不管这个。
    默认凭据:用户名 admin,密码 admin(首次登录后会强制要求修改)。

  2. 添加 Loki 数据源
    reference:


都部署完,如果日志不能入库,或者其它问题,就需要自己根据自己的环境,逐项排查了,建议AI配合。

BYE.


Alloy

// 接收 Syslog 数据
loki.source.syslog "syslog_receiver_1" {
  listener {
    address = "0.0.0.0:1514"
    protocol = "udp"            // 默认 Syslog 通常使用 UDP
    syslog_format = "rfc3164"  // 显式指定 RFC 3164 格式
    labels = {
      job = "X1",
    }
  }
  // 将接收到的日志转发给下一个组件(例如 loki.write)
  forward_to = [loki.write.local_loki.receiver]
}

// 接收 Syslog 数据2  - 根据端口去贴不同的标签
loki.source.syslog "syslog_receiver_2" {
  listener {
    address = "0.0.0.0:1515"     // 根据端口去贴不同的标签
    protocol = "udp"            // 默认 Syslog 通常使用 UDP
    syslog_format = "rfc3164"  // 显式指定 RFC 3164 格式
    labels = {
      job = "X2",  //根据不同的端口区分不同的job名
    }
  }
  // 将接收到的日志转发给下一个组件(例如 loki.write)
  forward_to = [loki.write.local_loki.receiver]
}

// 示例:定义发送到 Loki 的目标(请根据实际情况修改 URL)
loki.write "local_loki" {
  endpoint {
    url = "http://127.0.0.1:3100/loki/api/v1/push"
  }
}

//2026-2-6 该版本配置测试过了。

.\alloy.exe run config.alloy

nohup ./alloy-linux-amd64 run config.alloy > log.out 2>&1 &


调试

loki

>curl -H "Content-Type: application/json" -XPOST "http://127.0.0.1:3100/loki/api/v1/push" -d "{\"streams\": [{\"stream\": {\"job\": \"windows_cmd_test\"}, \"values\": [[\"1770192535000000000\", \"manual log from windows cmd\"]]} ]}"
entry for stream '{job="windows_cmd_test", service_name="windows_cmd_test"}' has timestamp too new: 2026-02-04T16:08:55+08:00

too new OR too old

Loki 有一个默认保护机制:拒绝接收时间戳超过当前系统时间 1 小时的日志。
现状:你的服务器当前时间(根据你执行命令反馈的时间戳)可能比你手动输入的 2026-02-04 16:08:55 要早。
后果:Loki 认为这是“未来的非法数据”,为了防止索引混乱,直接拒绝入库(报错 too new)。
这同时也解释了为什么 H3C 的日志进不去:H3C 设备的时钟可能比 Loki 服务器的时钟快了几分钟或几个小时。

在grafana 搜索:{job=~".+"}


promtial

如果 tcpdump 能看到包,但 Promtail 没反应,说明网络层通了,但应用层(Promtail)把包丢弃了或者没对上协议。

问题定位:
Promtail 的 syslog 接收器非常“死板”,如果数据不符合 RFC3164(比如 <13>Feb 5 10:00:00 ...)或 RFC5424 标准,它会静默丢弃,连日志都不会报。

image

查询了官网,promtail 只支持 RFC5424。

这个时候可以排查一下IPS发日志的设备,发出来的日志是什么格式?
H3C - IPS默认是什么格式?


syslog 日志格式

ips 设备 输出的日志格式默认是 RFC 3164, 当然也可以设置输出的日志格式,看下图。

a4478ea79223a655c73ef6afab255eac

但是我模拟 一条 RFC 5424 日志 ,也打不进去,卡住了。
调整了很久....

感觉promtail 问题很大,我用的还是V2.9.9 旧版本,调试非常难,没有输出。


promtail 问题

换了一个alloy 就好使了,使用默认配置都秒进库。

调试大致就这里了。

由于我的中标麒麟 glbc 不打算升级了,太麻烦,所以架构换成下图了:
image

从PLG 到 ALG。

posted on 2026-02-03 14:12  Mysticbinary  阅读(58)  评论(0)    收藏  举报