在 Debian 9 中使用 Rsyslog 安装集中式日志服务器
本教程适用于这些操作系统版本
- Debian 11(Bullseye)
- Debian 9(Stretch)
在此页
- 将 Rsyslog 配置为服务器
- 将 Rsyslog 配置为客户端
在 Linux 中,日志文件是包含有关系统功能的消息的文件,系统管理员使用这些消息来识别机器上的最终问题。这些日志可帮助管理员可视化一段时间内系统中发生的事件。通常,所有日志文件都保存在 Linux 中的 /var/log 目录下。在这个位置,有几种类型的日志文件用于存储各种消息,例如用于记录系统事件的日志文件、用于安全相关消息的日志文件、专用于内核、用户或 cron 作业的其他日志文件。日志文件的主要目的是解决系统问题。 Linux 中的大多数日志文件由 rsyslogd 服务控制。在较新版本的 Linux 发行版中,日志文件也由 journald 系统服务控制和管理,它是 systemd 初始化程序的一部分。 journal 守护进程存储的日志以二进制格式编写,主要是易失性的,存储在 RAM 和 /run/log/journal/ 中的环形缓冲区中。但是,日志服务也可以配置为永久存储 Syslog 消息。
在 Linux 中,rsyslog 服务器可以配置为以服务-客户端模型的方式运行中央日志管理器,并通过 TCP 或 UDP 传输协议在网络上发送日志消息,或者从网络设备、服务器、路由器、交换机或生成日志的其他系统或嵌入式设备。
Rsyslog 守护进程可以设置为同时作为客户端和服务器运行。配置为作为服务器运行,Rsyslog 将侦听默认端口 514 TCP 和 UDP,并将开始收集远程系统通过网络发送的日志消息。作为客户端,Rsyslog 将通过相同的 TCP 或 UDP 端口通过网络将内部日志消息发送到远程 Ryslog 服务器。
Rsyslog 将根据选定的属性和操作过滤系统日志消息。 rsyslog 过滤器如下:
- 设施或优先申报者
- 基于属性的过滤器
- 基于表达式的过滤器
设施过滤器由生成日志的 Linux 内部子系统表示。它们分类如下:
- auth/authpriv=身份验证过程产生的消息
- cron= 与 cron 任务相关的日志
- daemon=与运行系统服务相关的消息
- kernel=Linux 内核消息
- mail=邮件服务器消息
- syslog=与 syslog 或其他守护进程相关的消息(DHCP 服务器在此处发送日志)
- lpr=打印机或打印服务器消息
- local0 - local7=管理员控制下的自定义消息
优先级或严重级别分配给关键字和数字,如下所述。
- emerg=紧急 – 0
- alert=警报 – 1
- err=错误 – 3
- warn=警告 – 4
- notice=通知 – 5
- info=信息 – 6
- debug=调试 – 7 最高级别
还有一些特殊的 Rsyslog 关键字可用,例如用于定义所有
设施或优先级的星号 (*)、不指定优先级的 none 关键字、仅选择该优先级的等号 (=) 和感叹号 ( !) 这否定了优先级。
系统日志的操作部分由目标语句表示。日志消息的目的地可以是存储在文件系统中的文件、/var/log/ 系统路径中的文件、通过命名管道或 FIFO 的另一个本地进程输入。日志消息也可以定向到用户,丢弃到黑洞 (/dev/null) 或发送到标准输出或通过 TCP/UDP 协议发送到远程系统日志服务器。日志消息也可以存储在数据库中,例如 MySQL 或 PostgreSQL。
将 Rsyslog 配置为服务器
Rsyslog 守护进程自动安装在大多数 Linux 发行版中。但是,如果您的系统上未安装 Rsyslog,您可以发出以下命令之一以安装该服务 > 您将需要 root 权限才能运行这些命令。
在基于 Debian 的发行版中:
sudo apt-get install rsyslog
在 CentOS 等基于 RHEL 的发行版中:
sudo yum install rsyslog
为了验证 Rsyslog 守护进程是否在系统上启动,请执行以下命令,具体取决于您的分发版本。
在较新的带有 systemd 的 Linux 发行版上:
systemctl status rsyslog.service
在带有 init 的旧 Linux 版本上:
service rsyslog status
/etc/init.d/rsyslog status
为了启动 rsyslog 守护进程,请发出以下命令。
在带有 init 的旧 Linux 版本上:
service rsyslog start
/etc/init.d/rsyslog start
在最新的 Linux 发行版上:
systemctl start rsyslog.service
要将 rsyslog 程序设置为在服务器模式下运行,请编辑 /etc/rsyslog.conf 中的主配置文件。在此文件中进行以下更改,如以下示例所示。
sudo vi /etc/rsyslog.conf
通过删除以下行的标签 (#) 找到并取消注释,以允许在 514 端口上接收 UDP 日志消息。默认情况下,syslog 使用 UDP 端口发送-接收消息。
$ModLoad imudp
$UDPServerRun 514
由于 UDP 协议在网络上交换数据不可靠,您可以设置 Rsyslog 通过 TCP 协议将日志消息输出到远程服务器。要启用 TCP 接收协议,请打开 /etc/rsyslog.conf 文件并取消注释以下行,如下所示。这将允许 rsyslog 守护程序绑定和侦听端口 514 上的 TCP 套接字。
$ModLoad imtcp
$InputTCPServerRun 514
可以在 rsyslog 中启用这两种协议以同时运行。
如果要指定允许哪些发件人访问 rsyslog 守护程序,请在启用的协议行之后添加以下行:
$AllowedSender TCP, 127.0.0.1, 10.110.50.0/24, *.yourdomain.com
您还需要创建一个新模板,该模板将在接收传入日志之前由 rsyslog 守护进程解析。该模板应指示本地 Rsyslog 服务器在何处存储传入的日志消息。在 $AllowedSender 行之后定义模板,如以下示例所示。
$template Incoming-logs,"/var/log/%HOSTNAME%/%PROGRAMNAME%.log"
*.* ?Incoming-logs
& ~
要仅记录内核设施生成的消息,请使用以下语法。
kern.* ?Incoming-logs
接收到的日志由上述模板解析,并将存储在 /var/log/ 目录中的本地文件系统中,以生成消息的客户端主机名客户端设施命名的文件中:%HOSTNAME%和 %PROGRAMNAME% 变量。
下面的 & ~ 重定向规则将 Rsyslog 守护进程配置为仅将传入的日志消息保存到上述由变量名称指定的文件中。否则,接收到的日志将被进一步处理并存储在本地日志的内容中,例如/var/log/syslog 文件。
要添加规则以丢弃所有相关日志消息到邮件,您可以使用以下语句。
mail.* ~
其他可用于输出文件名的变量有:%syslogseverity%、%syslogfacility%、%timegenerated%、%HOSTNAME%、%syslogtag%、%msg%、%FROMHOST-IP%、%PRI%、%MSGID%、 %APP-NAME%, %TIMESTAMP%, %$year%, %$month%, %$day%
从 Rsyslog 版本 7 开始,可以使用新的配置格式在 Rsyslog 服务器中声明模板。
版本 7 模板示例可能如下所示。
template(name="MyTemplate" type="string"
string="/var/log/%FROMHOST-IP%/%PROGRAMNAME:::secpath-replace%.log"
)
另一种模式你可以写上面的模板也可以如下图:
template(name="MyTemplate" type="list") {
constant(value="/var/log/")
property(name="fromhost-ip")
constant(value="/")
property(name="programname" SecurePath="replace")
constant(value=".log")
}
为了应用对 rsyslog 配置文件所做的任何更改,您必须重新启动守护程序以加载新配置。
sudo service rsyslog restart
sudo systemctl restart rsyslog
要检查在 Debian Linux 系统上打开了哪些处于侦听状态的 rsyslog 套接字,您可以使用 root 权限执行 netstat 命令。通过过滤实用程序(例如 grep)传递结果。
sudo netstat –tulpn | grep rsyslog
请注意,您还必须在防火墙中打开 Rsyslog 端口,以允许建立传入连接。
在激活了 Firewalld 的基于 RHEL 的发行版中,发出以下命令:
firewall-cmd --permanent --add-port=514/tcp
firewall-cmd --permanent --add-port=514/tcp
firewall-cmd –reload
在启用了 UFW 防火墙的基于 Debian 的发行版中,发出以下命令:
ufw allow 514/tcp
ufw allow 514/udp
Iptables 防火墙规则:
iptables -A INPUT -p tcp -m tcp --dport 514 -j ACCEPT
iptables -A INPUT -p udp --dport 514 -j ACCEPT
将 Rsyslog 配置为客户端
要使 rsyslog 守护进程以客户端模式运行并将本地日志消息输出到远程 Rsyslog 服务器,请编辑 /etc/rsyslog.conf 文件并添加以下行之一:
*. * @IP_REMOTE_RSYSLOG_SERVER:514
*. * @FQDN_RSYSLOG_SERVER:514
此行使 Rsyslog 服务能够将所有内部日志输出到 UDP 端口 514 上的远程 Rsyslog 服务器。
要通过 TCP 协议发送日志,请使用以下模板:
*. * @@IP_reomte_syslog_server:514
要仅将具有所有优先级的 cron 相关日志输出到 rsyslog 服务器,请使用以下模板:
cron.* @ IP_reomte_syslog_server:514
如果无法通过网络访问 Rsyslog 服务器,请将以下行附加到客户端的 /etc/rsyslog.conf 文件中,以便将日志临时存储在磁盘缓冲文件中,直到服务器联机。
$ActionQueueFileName queue
$ActionQueueMaxDiskSpace 1g
$ActionQueueSaveOnShutdown on
$ActionQueueType LinkedList
$ActionResumeRetryCount -1
要应用上述规则,需要重新启动 Rsyslog 守护进程以充当客户端。