我正在尝试将日志从监狱发送到 FreeBSD 10 上的主机系统。
我认为所有设置都正确,但我无法让它工作。
直接从 Nginx 1.7 发送日志可以,但不能通过 syslog(例如 PHP-FPM)发送日志。
这是我的主人的/etc/rc.conf
:
syslogd_flags="-a 10.0.0.1/24:* -v -v -C"
我的主人etc/syslog.conf
:
+ABCD
*.=info /var/log/jails/ABCD/nginx-access.log
*.=error /var/log/jails/ABCD/nginx-error.log
*.* /var/log/jails/ABCD/all.log
这是监狱的etc/rc.conf
:
syslogd_flags="-ss -v -v"
还有监狱的etc/syslog.conf
:
!php-fpm
*.* @127.0.0.1
etc/hosts
在两个系统中均已设置。
使用工具手动将日志直接发送至主机logger
。
使用调试功能,我可以看到监狱正在转发我手动创建的日志logger -t php-fpm
:
Logging to FORW 127.0.0.1
但日志从未到达主机。那里的调试器没有收到任何消息。对 Nginx 内置的 syslog 功能执行相同操作即可。
我已经尝试设置了syslogd_flags="-s -v -v"
。然后我就无法再手动发送任何日志,而且情况也没有改变。
答案1
正如@citrin 提到的,这个-ss
标志不是你想要的。
以下内容对我有用,在 FreeBSD 12.1 上,没有vnet
配置虚拟化。
192.168.1.1 是主机的 IP。192.168.1.68
是 jail 的 IP。
确保主机和 jail 可以互相 ping 通。
确保没有防火墙规则阻止主机和 jail 之间的 UDP 端口 514。
在监狱里:
# sysrc syslogd_enable=yes
# sysrc syslogd_flags="-s -vv"
# cat /etc/syslog.conf
*.* @192.168.1.1
# grep 192.168 /etc/hosts
# 192.168.0.0 - 192.168.255.255
192.168.1.68 jail
192.168.1.1 host
# service syslogd stop
# service syslogd start
在主机上:
# sysrc syslogd_enable="yes"
# sysrc syslogd_flags="-a 192.168.1.68 -vv"
# tail -4 /etc/syslog.conf
+jail
*.* /var/log/test-jail.log
# touch /var/log/test-jail.log
# grep 192.168 /etc/hosts
# 192.168.0.0 - 192.168.255.255
192.168.1.1 vlan3
192.168.1.68 jail
# service syslogd stop
# service syslogd start
如果这仍然不起作用,这里有一些很好的故障排除建议FreeBSD 手册页面最值得注意的是主机端开关syslogd
的使用:-d
# sysrc syslogd_flags="-d -a 192.168.1.68 -vv"
这会产生大量的输出,因此请仔细阅读。
最后,远程系统日志记录有时有点麻烦,也许更高级的管理员可以在评论中添加原因。我最成功的时候是不要引用字符串中的 /etc/hosts 条目syslogd_flags
。使用文字 IP 数字对我来说效果更好。这可能是由于未使用合法的完全合格域名和/或真实 DNS 名称。如果时间允许,我将探索这些可能性并更新此答案。
更新:
在设置了一些测试 DNS 条目并尝试了各种配置后,我认为之前遇到的所有困难都是由于工作仓促和/或对细节的关注不一致造成的。一旦我/etc/syslog.conf
在 jail 和主机上都有了可靠的框架,以及系统日志友好的防火墙条目,我的 jail-to-host 远程日志记录似乎可以使用正确的 DNS 名称、/etc/hosts
条目或原始 IP 号码进行工作。
答案2
使用-ss
标志 syslogd 不打开任何套接字,即使将日志发送到其他主机也是如此。在 jail 中使用syslogd_flags="-s -b localhost"
在 jail 中配置 php-fpm 通过 unix 套接字记录到本地 syslogd,并验证来自 php-fpm 的消息是否可以由本地 syslogd 写入文件。
php-fpm.conf:
error_log = syslog;
syslog.facility = local7
/etc/syslog.conf
!*
local7.* /var/log/for-test-php.log
如果消息被写入 jail 内的日志,则用 @10.xxx 替换文件路径,其中 10.xxx 是主机的 IP 地址,可从 jail 访问。
在主机上,您可以在前台运行 syslogd 来检查是否收到消息:
service syslogd stop
syslogd -a 10.0.0.1/24:* -v -v -d
....
Ctrl+C
service syslogd start