1. 为什么使用vector

我的自托管服务器使用UNRAID系统。本身的日志信息存储在内存中,发生意外宕机的情况就无法追溯日志了。

但是它提供了对接外部syslog服务器的功能。于是便打算将日志推送到远程服务器

2. 实施方案

  1. 由于UNRAID 自带的syslog 远程服务器配置,只支持简单的 ip(url) 和 port 配置。而云平台上传日志基本都需要鉴权,所以无法直接上传日志到云平台
  2. 使用 VECTOR (一款轻量级、超快速的用于构建可观测性管道的工具) 进行数据接受,并进行转发
  3. 云日志平台的选择。在vector支持的平台中,papertrailbetter stack 提供的免费服务额度比较好用
  4. 云日志平台的免费服务基本只提供2-7天的日志存储,所以可以在转发一份日志到S3平台

生成网络设施关系图.png

3. vector 部署

vector可以自托管部署,可以部署在自己的服务器上,也可以使用railway的免费容器服务进行部署。
部署在自己的服务器上比较简单,直接使用官方的docker镜像进行部署就好了。
我这边提供下部署在railway上的方案。

3.1 新建GitHub项目

新建一个github项目。项目内容如下
rsyslog-railway/
├── Dockerfile
└── vector.yaml

Dockerfile

1
2
3
4
5
6
7
8
9
10
11
FROM timberio/vector:0.35.0-debian

# 复制 Vector 配置文件
COPY vector.yaml /etc/vector/vector.yaml

# 暴露端口 (Railway 会动态分配)
EXPOSE 514/udp 514/tcp

# 使用配置文件启动 Vector
ENTRYPOINT ["vector"]
CMD ["--config", "/etc/vector/vector.yaml"]

vector.yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
---
# Vector 配置文件
# 接收 syslog 输入并转发到多个平台

sources:
# 接收 UDP syslog (Unraid 默认使用 UDP 514)
syslog_udp:
type: syslog
address: "0.0.0.0:${PORT:-514}" # 使用 Railway 的 PORT 环境变量
mode: udp
max_length: 8192

# 接收 TCP syslog (可选,用于 TLS 或可靠传输)
syslog_tcp:
type: syslog
address: "0.0.0.0:${PORT_TCP:-514}"
mode: tcp
max_connections: 100

sinks:
# 转发到 SolarWinds Observability
solarwinds:
type: http
inputs:
- syslog_udp
- syslog_tcp
method: post
uri: "https://yourpapertrailurl/v1/logs"
auth:
strategy: bearer
token: "${SWO_TOKEN}" # 在 Railway 中设置此环境变量
encoding:
codec: json # 发送原始 syslog 消息
headers:
Content-Type: "application/json"
batch:
max_events: 100
timeout_secs: 10

# 转发到 Better Stack
betterstack:
type: http
inputs:
- syslog_udp
- syslog_tcp
method: post
uri: "${BETTERSTACK_URL}" # 在 Railway 中设置此环境变量
auth:
strategy: bearer
token: "${BETTERSTACK_TOKEN}" # 在 Railway 中设置此环境变量
encoding:
codec: json
timestamp_format: rfc3339
headers:
Content-Type: "application/json"
batch:
max_events: 100
timeout_secs: 10

# 转发到 S3 兼容服务
s3:
type: aws_s3
inputs:
- syslog_udp
- syslog_tcp
bucket: "yourbucket"
region: "${AWS_REGION:-us-east-1}" # 在 Railway 中设置此环境变量
endpoint: "https://yourendpoint"
auth:
access_key_id: "${AWS_ACCESS_KEY_ID}" # 在 Railway 中设置此环境变量
secret_access_key: "${AWS_SECRET_ACCESS_KEY}" # 在 Railway 中设置此环境变量
encoding:
codec: json
timestamp_format: rfc3339
compression: none
key_prefix: "syslog/%Y/%m/"
filename_time_format: "%d-%H:%M:%S"
filename_append_uuid: true
filename_extension: "json"
batch:
max_events: 1000
timeout_secs: 3600


3.2 在railway 部署项目

  1. 在railway新建项目。选择 github 仓库,然后选择你刚才创建的github项目
    image.png

  2. 配置变量
    image.png

  3. 配置端口
    在setting -> networking -> tcpProxy 中配置代理 514 端口
    image.png

3.3 uptimerobot防止项目休眠

railway的免费服务,在运行10分钟后,如果没有请求会自动休眠。
所以可以使用 uptimerobot 设置每5分钟进行一次请求,从而保证项目一直运行
image.png

4. 最终效果

云平台日志提供实时搜索和额外的告警功能。s3 存储提供永久文件保存
image.png