如何让 syslogd 接受来自 Snow Leopard 上的远程主机的传入连接?
我想集中日志记录,以便各种设备和系统将日志发送到 Snow Leopard 的 syslogd,后者通常挂在 UDP 514 上。但是,我无法让它们被好用的 syslogd 成功接受。我在 Snow Leopard 盒子上执行了 tcpdump 以验证数据包是否被发送到端口 514 — 确实如此。我检查了 syslogd 是否正在监听 514 — 事实并非如此。
通过谷歌搜索,我发现在旧版本的 OSX 上(难道您不喜欢 OSX 上变化如此之快的方式吗),只需向 syslogd 守护程序添加一个标志即可允许远程;可以在 com.apple.syslogd.plist 中执行此操作。但是 syslogd 守护程序没有标志(至少在其手册页中没有)来提示任何远程操作。
有什么办法可以解决这个问题?
次要的、不太重要但相关的问题:什么是“newsyslog”?我看到一个 plist 文件,但它没有运行(显然)。
谢谢
答案1
我还没有尝试过这个,但是我在 plist 中查找了 syslogd (/System/Library/LaunchDaemons/com.apple.syslogd.plist) 并看到这部分被注释掉了:
<!--
Un-comment the following lines to enable the network syslog protocol listener.
-->
<!--
<key>NetworkListener</key>
<dict>
<key>SockServiceName</key>
<string>syslog</string>
<key>SockType</key>
<string>dgram</string>
</dict>
-->
删除注释然后重新加载服务:
$ sudo launchctl unload /System/Library/LaunchDaemons/com.apple.syslogd.plist
$ sudo launchctl load /System/Library/LaunchDaemons/com.apple.syslogd.plist
您可能已经上路了。
回答你的第二个问题——newsyslog
类似于日志旋转通常在 Linux 系统上发现。man newsyslog
(或在线的)将会告诉你更多。
与 Snow Leopard 一起安装后,它会根据launchd
其 plist 中的以下位每 30 分钟运行一次:
<key>StartCalendarInterval</key>
<dict>
<key>Minute</key>
<integer>30</integer>
</dict>
答案2
请注意,如果你尝试在雪豹服务器机器(至少是 10.6.4),你会发现 /System/Library/LaunchDaemons/com.apple.syslogd.plist 中没有注释掉的部分(并且 plist 文件以二进制格式存储)。
但是,复制并粘贴 Doug 上面引用的密钥就可以了,不过首先你需要将文件的格式转换为文本:
sudo plutil -convert xml1 /System/Library/LaunchDaemons/com.apple.syslogd.plist
...并且您可能应该随后将其转换回来(转换在原地进行):
sudo plutil -convert binary1 /System/Library/LaunchDaemons/com.apple.syslogd.plist
...然后根据 Doug 的指示重新加载 launchd 守护进程。
随后,完整的 plist 文件应如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>EnableTransactions</key>
<true/>
<key>HopefullyExitsLast</key>
<true/>
<key>Label</key>
<string>com.apple.syslogd</string>
<key>MachServices</key>
<dict>
<key>com.apple.system.logger</key>
<true/>
</dict>
<key>OnDemand</key>
<false/>
<key>ProgramArguments</key>
<array>
<string>/usr/sbin/syslogd</string>
</array>
<key>Sockets</key>
<dict>
<key>AppleSystemLogger</key>
<dict>
<key>SockPathMode</key>
<integer>438</integer>
<key>SockPathName</key>
<string>/var/run/asl_input</string>
</dict>
<key>BSDSystemLogger</key>
<dict>
<key>SockPathMode</key>
<integer>438</integer>
<key>SockPathName</key>
<string>/var/run/syslog</string>
<key>SockType</key>
<string>dgram</string>
</dict>
<key>NetworkListener</key>
<dict>
<key>SockServiceName</key>
<string>syslog</string>
<key>SockType</key>
<string>dgram</string>
</dict>
</dict>
</dict>
</plist>
还有一点需要注意:如果你和我一样,想要将 AirPort 基站(和/或 Time Capsules)的系统日志输出发送到你的服务器,它们会使用设备 0,这是无法改变的。这意味着它们将被自动记录到 /var/log/appfirewall.log,因为 /etc/syslog.conf 中有以下默认条目:
local0.* /var/log/appfirewall.log
在服务器版本的操作系统上,一旦您发出以下命令,您就可以安全地将文件名更改为 AirPort.log:
sudo touch /var/log/AirPort.log
...因为 Apple 的应用程序防火墙 (socketfilterfw) 默认关闭(在服务器上也应该保持关闭状态 — ipfw 才是您真正想要的)。我不确定是否可以重新配置 socketfilterfw 以使用不同的 syslog 工具。
答案3
在 Snow Leopard 上启用 syslogd 网络访问的另一种方法是使用命令行程序 PlistBuddy,
sudo /usr/libexec/PlistBuddy /System/Library/LaunchDaemons/com.apple.syslogd.plist
add :Sockets:NetworkListener dict
add :Sockets:NetworkListener:SockServiceName string syslog
add :Sockets:NetworkListener:SockType string dgram
save
quit
然后重新启动守护进程,
sudo launchctl unload com.apple.syslogd.plist
sudo launchctl load com.apple.syslogd.plist
您可以使用 lsof 检查 syslogd 是否正在监听标准 syslog 端口 514,
$ sudo lsof -i:514
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
launchd 1 root 44u IPv6 0x0e459370 0t0 UDP *:syslog
launchd 1 root 56u IPv4 0x0f7a9ef0 0t0 UDP *:syslog
syslogd 24319 root 5u IPv6 0x0e459370 0t0 UDP *:syslog
syslogd 24319 root 6u IPv4 0x0f7a9ef0 0t0 UDP *:syslog