centralized logging on Amazon Linux 2023

背景介绍

最近要做个 log server,把所有服务器的系统日志都收上来。我现在的服务器,操作系统有两种:Amazon Linux 2023 和 Ubuntu,但其实 Ubuntu 又有 22.04 和 24.04 两种,所以,其实是一共有三种操作系统。

好在这三种系统,其缺省跑的日志应用,Amazon Linux 2023 是 systemd-journald,而 Ubuntu(22.04 和 24.04) 都是既跑有 systemd-journald,又跑的有 rsyslogd。这两种日志应用,都是支持集中的日志服务器的,或者很容易支持。但是为什么不就用一套 rsyslogd 的日志服务器呢?毕竟大家都支持 rsyslogd 的。主要是因为 systemd-journald 相对于 rsyslogd 是很新的东西,所以这里也拿出来练练手。

rsyslogd

server

rsyslog 的 log server 配置还是相当简单的

1
2
vim /etc/rsyslog.d/remote.conf
# 新建 /etc/rsyslog.d/remote.conf 文件

加入如下内容:

1
2
3
4
5
6
7
8
9
10
11
module(load="imudp")
input(type="imudp" port="514")
module(load="imtcp")
input(type="imtcp" port="514")

template(name="RemoteLogsWithHostIPDate" type="string" string="/var/log/remote/rsyslog/%fromhost-ip%_%hostname%/%programname%-%$YEAR%-%$MONTH%-%$DAY%.log")

if ($fromhost-ip == "127.0.0.1") then {
stop
}
*.* action(type="omfile" dynaFile="RemoteLogsWithHostIPDate")

重启 rsyslogd

1
systemctl restart rsyslog

client

客户端的配置也相当简单

1
2
vim /etc/rsyslog.d/99-remote.conf
# 新建文件:/etc/rsyslog.d/99-remote.conf

写入如下内容:

1
2
3
*.* @logserver.xxx.xxx:514
# 用 udp 把日志打到前面配好的 rsyslog 日志服务器
# 地址假设是 `logserver.xxx.xxx`

最后重启 rsyslog

1
systemctl restart rsyslog

systemd-journal-remote

server

1
2
3
4
5
6
dnf install systemd-journal-remote
# install software depended, log server is based on Amazon Linux 2023
systemctl edit systemd-journal-remote.service
# change the configuration of service systemd-journal-remote
# NOTE: must write in the special blank lines
# 注意:必须在指定的空行内输入配置

指定的空行内输入如下内容:

1
2
3
4
5
6
[Service]
ExecStart=
ExecStart=/usr/lib/systemd/systemd-journal-remote --listen-http=-3 --output=/var/log/remote/journal/
LogsDirectory=remote/journal
# 如果 ExecStart 那一行的 --output 参数指定的目录没改的话
# 最后那一行是不需要的

保存以后,使得

1
cat /etc/systemd/system/systemd-journal-remote.service.d/override.conf

能看到之前输入的内容即可。

1
2
mkdir /var/log/remote/journal
systemctl edit systemd-journal-remote.socket

指定的空行里输入:

1
2
3
[Socket]
ListenStream=
ListenStream=19532

保存后退出。使得

1
cat /etc/systemd/system/systemd-journal-remote.socket.d/override.conf

输出的内容正是之前输入的即可。

1
2
systemctl enable --now systemd-journal-remote.socket
# enable and start systemd-journal-remote.socket

client

1
2
3
4
5
6
7
8
9
10
dnf install systemd-journal-remote
# install software depended
mkdir /etc/systemd/journal-upload.conf.d/
cat <<EOF > /etc/systemd/journal-upload.conf.d/override.conf
[Upload]
URL=http://logserver.xxx.xxx:19532
EOF

systemctl enable --now systemd-journal-upload.service
# enable and start service of systemd-journal-upload

参考