Rsyslog - 日志未显示在服务器上
Rsyslog - logs not displayed on server
正在尝试配置 Rsyslog 客户端以将日志发送到 Rsyslog 服务器。
Centos7 上的两台机器 运行 Vagrant。
查看下面每台机器的配置。
当我登录客户端机器时 - 它没有反映在服务器的日志中。
例如:
logger "Some message..."
但是当我将服务器的IP添加到命令中时:
logger -n 192.168.11.11 "Some message..."
我可以看到正在服务器计算机上创建一个包含客户端 IP 的目录:
[root@server log]# ls -la
total 200
drwxr-xr-x. 11 root root 4096 Aug 1 12:02 .
drwxr-xr-x. 18 root root 254 Jul 31 21:39 ..
drwx------. 2 root root 25 Jul 31 22:18 192.168.11.22 <--- HERE
drwxr-xr-x. 2 root root 191 Feb 28 20:54 anaconda
drwx------. 2 root root 23 Jul 31 21:39 audit
-rw-------. 1 root utmp 0 Aug 1 03:14 btmp
drwxr-xr-x. 2 chrony chrony 6 Apr 12 2018 chrony
-rw-------. 1 root root 188 Jul 31 21:39 cron
-rw-r--r--. 1 root root 26911 Aug 1 12:02 dmesg
-rw-r--r--. 1 root root 26742 Jul 31 21:39 dmesg.old
-rw-r--r--. 1 root root 374 Jul 31 21:47 firewalld
-rw-r--r--. 1 root root 292292 Aug 1 12:12 lastlog
-rw-------. 1 root root 198 Jul 31 21:39 maillog
.......
.......
里面有一个 vagrant.log
文件,我可以在其中看到客户端的日志消息:
2019-08-01T13:00:06+00:00 192.168.11.22 vagrant: Some message...
问题:知道为什么我看不到客户端本地日志吗?
对于此讨论:
- SELINUX 已禁用。
- This 没有帮助。
Rsyslog 配置
服务器IP:192.168.11.11
.
客户端 IP:192.168.11.22
.
两台机器都安装并启用了 rsyslog,并且在 /etc/rsyslog.conf
文件中有以下 common 设置:
#### MODULES ####
$ModLoad imuxsock
$ModLoad imjournal
#Open port 514 For UDP
$ModLoad imudp
$UDPServerRun 514
#### GLOBAL DIRECTIVES ####
$WorkDirectory /var/lib/rsyslog
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat
$IncludeConfig /etc/rsyslog.d/*.conf
$OmitLocalLogging on
$IMJournalStateFile imjournal.state
#### RULES ####
kern.* /dev/console
*.info;mail.none;authpriv.none;cron.none /var/log/messages
authpriv.* /var/log/secure
local7.* /var/log/boot.log
/etc/rsyslog.conf
文件中每台机器的添加。
在服务器机器上:
## Rules for processing remote logs
$template RemoteLogs,"/var/log/%HOSTNAME%/%PROGRAMNAME%.log"
*.* ?RemoteLogs
& ~
在 Client 机器上,我设置 UDP 转发到服务器的 IP:
# ### begin forwarding rule ###
#UDP Forwarding
*. * @192.168.11.11:514
# ### end of the forwarding rule ###
防火墙配置
在 Server 机器上 - 在防火墙上打开端口 514:
sudo firewall-cmd --permanent --add-port=514/udp
sudo firewall-cmd --reload
并验证:
[root@server /]# sudo ss -tulnp | grep "rsyslog"
udp UNCONN 0 0 *:514 *:* users:(("rsyslogd",pid=2711,fd=3))
udp UNCONN 0 0 :::514 :::* users:(("rsyslogd",pid=2711,fd=4))
尝试在客户端主机上删除 *.
后的一个空格:
*. * @192.168.11.11:514
在远程主机上发送任何级别的日志的默认格式如下:
*.* @remote-host:514
然后用systemctl restart rsyslog
在客户端和服务器上重启rsyslog服务并再次检查。
编辑:
从评论中粘贴 - 在解决问题的系统日志服务器上完成的另外 2 个步骤:
正在评论服务器上的 #### Rules ####
部分。
从 ## Rules for processing remote logs
部分删除 & ~
。
感谢@Alexey 在两个关键点上帮助了我。
我还会补充一些可能对其他人有用的要点:
1:首先检查两台机器的连通性。
例如,如果使用 vagrant 网络,请将两台机器置于它们可以相互看到 (ping) 的网络模式。例如,Host-only 模式是可以的,但是每台机器都在其独立网络上的内部模式将不起作用。
2:仅在系统日志服务器中需要取消注释以下代码:
$ModLoad imudp
$UDPServerRun 514
3:在客户端机器上 - 您可以注释所有 #### Rules ####
部分并将转发规则放在文件末尾 OR
您可以指定内联转发(使用客户端 IP 或主机名,如果在 /etc/hosts
中配置):
#### RULES ####
kern.* /dev/console
*.info;mail.none;authpriv.none;cron.none @192.168.11.11:514 # <--- Like this
auth,authpriv.* /var/log/secure
local7.* /var/log/boot.log
4:快速检查UDP连接是否成功:
将授权日志转发到服务器(像这样auth,authpriv.* @192.168.11.11:514
)。
ssh进入客户端机器,切换用户,查看服务器/var/log/目录下的以下文件:
sshd.log su.log sudo.log systemd-logind.log
5:小心 rsyslog 语法 - 例如,如果您使用 sed 作为配置脚本的一部分以替换和编辑配置文件中的行 - 检查输出:
在一行中指定 $template 部分:
$template RemoteLogs,"/var/log/%HOSTNAME%/%PROGRAMNAME%.log" *.* ?RemoteLogs
会导致错误:
Aug 03 13:50:04 server rsyslogd[5539]: error: extra characters in
config line ignored: '. ?RemoteLogs' [v8.24.0-34.el7]
这是正确的语法 - 将规则换行(如果使用 sed
生成 - 只需添加 /n
):
$template RemoteLogs,"/var/log/%HOSTNAME%/%PROGRAMNAME%.log"
*.* ?RemoteLogs
6: 不要忘记 /etc/rsyslog.conf
中每次更改后的 systemctl restart rsyslog
。由于像#5 这样的情况总是检查 rsyslog 状态:systemctl status rsyslog
.
7:较新版本的 rsyslog(我认为 5+)支持更简洁的语法 - 例如,它现在作为较新版本 Ubuntu 的默认设置,但由于某些原因不在 Centos7 上。
8:在系统日志服务器上 - 确保您的防火墙已启用并配置为在相关端口上接受 UDP(请参阅问题中的配置脚本):
Chain IN_public_allow (1 references)
target prot opt source destination
ACCEPT tcp -- anywhere anywhere tcp dpt:ssh ctstate NEW
ACCEPT udp -- anywhere anywhere udp dpt:syslog ctstate NEW
正在尝试配置 Rsyslog 客户端以将日志发送到 Rsyslog 服务器。
Centos7 上的两台机器 运行 Vagrant。
查看下面每台机器的配置。
当我登录客户端机器时 - 它没有反映在服务器的日志中。
例如:
logger "Some message..."
但是当我将服务器的IP添加到命令中时:
logger -n 192.168.11.11 "Some message..."
我可以看到正在服务器计算机上创建一个包含客户端 IP 的目录:
[root@server log]# ls -la
total 200
drwxr-xr-x. 11 root root 4096 Aug 1 12:02 .
drwxr-xr-x. 18 root root 254 Jul 31 21:39 ..
drwx------. 2 root root 25 Jul 31 22:18 192.168.11.22 <--- HERE
drwxr-xr-x. 2 root root 191 Feb 28 20:54 anaconda
drwx------. 2 root root 23 Jul 31 21:39 audit
-rw-------. 1 root utmp 0 Aug 1 03:14 btmp
drwxr-xr-x. 2 chrony chrony 6 Apr 12 2018 chrony
-rw-------. 1 root root 188 Jul 31 21:39 cron
-rw-r--r--. 1 root root 26911 Aug 1 12:02 dmesg
-rw-r--r--. 1 root root 26742 Jul 31 21:39 dmesg.old
-rw-r--r--. 1 root root 374 Jul 31 21:47 firewalld
-rw-r--r--. 1 root root 292292 Aug 1 12:12 lastlog
-rw-------. 1 root root 198 Jul 31 21:39 maillog
.......
.......
里面有一个 vagrant.log
文件,我可以在其中看到客户端的日志消息:
2019-08-01T13:00:06+00:00 192.168.11.22 vagrant: Some message...
问题:知道为什么我看不到客户端本地日志吗?
对于此讨论:
- SELINUX 已禁用。
- This 没有帮助。
Rsyslog 配置
服务器IP:192.168.11.11
.
客户端 IP:192.168.11.22
.
两台机器都安装并启用了 rsyslog,并且在 /etc/rsyslog.conf
文件中有以下 common 设置:
#### MODULES ####
$ModLoad imuxsock
$ModLoad imjournal
#Open port 514 For UDP
$ModLoad imudp
$UDPServerRun 514
#### GLOBAL DIRECTIVES ####
$WorkDirectory /var/lib/rsyslog
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat
$IncludeConfig /etc/rsyslog.d/*.conf
$OmitLocalLogging on
$IMJournalStateFile imjournal.state
#### RULES ####
kern.* /dev/console
*.info;mail.none;authpriv.none;cron.none /var/log/messages
authpriv.* /var/log/secure
local7.* /var/log/boot.log
/etc/rsyslog.conf
文件中每台机器的添加。
在服务器机器上:
## Rules for processing remote logs
$template RemoteLogs,"/var/log/%HOSTNAME%/%PROGRAMNAME%.log"
*.* ?RemoteLogs
& ~
在 Client 机器上,我设置 UDP 转发到服务器的 IP:
# ### begin forwarding rule ###
#UDP Forwarding
*. * @192.168.11.11:514
# ### end of the forwarding rule ###
防火墙配置
在 Server 机器上 - 在防火墙上打开端口 514:
sudo firewall-cmd --permanent --add-port=514/udp
sudo firewall-cmd --reload
并验证:
[root@server /]# sudo ss -tulnp | grep "rsyslog"
udp UNCONN 0 0 *:514 *:* users:(("rsyslogd",pid=2711,fd=3))
udp UNCONN 0 0 :::514 :::* users:(("rsyslogd",pid=2711,fd=4))
尝试在客户端主机上删除 *.
后的一个空格:
*. * @192.168.11.11:514
在远程主机上发送任何级别的日志的默认格式如下:
*.* @remote-host:514
然后用systemctl restart rsyslog
在客户端和服务器上重启rsyslog服务并再次检查。
编辑:
从评论中粘贴 - 在解决问题的系统日志服务器上完成的另外 2 个步骤:
正在评论服务器上的
#### Rules ####
部分。从
## Rules for processing remote logs
部分删除& ~
。
感谢@Alexey 在两个关键点上帮助了我。
我还会补充一些可能对其他人有用的要点:
1:首先检查两台机器的连通性。 例如,如果使用 vagrant 网络,请将两台机器置于它们可以相互看到 (ping) 的网络模式。例如,Host-only 模式是可以的,但是每台机器都在其独立网络上的内部模式将不起作用。
2:仅在系统日志服务器中需要取消注释以下代码:
$ModLoad imudp
$UDPServerRun 514
3:在客户端机器上 - 您可以注释所有 #### Rules ####
部分并将转发规则放在文件末尾 OR
您可以指定内联转发(使用客户端 IP 或主机名,如果在 /etc/hosts
中配置):
#### RULES ####
kern.* /dev/console
*.info;mail.none;authpriv.none;cron.none @192.168.11.11:514 # <--- Like this
auth,authpriv.* /var/log/secure
local7.* /var/log/boot.log
4:快速检查UDP连接是否成功:
将授权日志转发到服务器(像这样auth,authpriv.* @192.168.11.11:514
)。
ssh进入客户端机器,切换用户,查看服务器/var/log/目录下的以下文件:
sshd.log su.log sudo.log systemd-logind.log
5:小心 rsyslog 语法 - 例如,如果您使用 sed 作为配置脚本的一部分以替换和编辑配置文件中的行 - 检查输出:
在一行中指定 $template 部分:
$template RemoteLogs,"/var/log/%HOSTNAME%/%PROGRAMNAME%.log" *.* ?RemoteLogs
会导致错误:
Aug 03 13:50:04 server rsyslogd[5539]: error: extra characters in config line ignored: '. ?RemoteLogs' [v8.24.0-34.el7]
这是正确的语法 - 将规则换行(如果使用 sed
生成 - 只需添加 /n
):
$template RemoteLogs,"/var/log/%HOSTNAME%/%PROGRAMNAME%.log"
*.* ?RemoteLogs
6: 不要忘记 /etc/rsyslog.conf
中每次更改后的 systemctl restart rsyslog
。由于像#5 这样的情况总是检查 rsyslog 状态:systemctl status rsyslog
.
7:较新版本的 rsyslog(我认为 5+)支持更简洁的语法 - 例如,它现在作为较新版本 Ubuntu 的默认设置,但由于某些原因不在 Centos7 上。
8:在系统日志服务器上 - 确保您的防火墙已启用并配置为在相关端口上接受 UDP(请参阅问题中的配置脚本):
Chain IN_public_allow (1 references)
target prot opt source destination
ACCEPT tcp -- anywhere anywhere tcp dpt:ssh ctstate NEW
ACCEPT udp -- anywhere anywhere udp dpt:syslog ctstate NEW