从另一个线程在 Stack Exchange 上,我发现在 Lion 或 Mountain Lion 上启用 syslogd 来接受传入连接非常容易。
cd /System/Library/LaunchDaemons
sudo /usr/libexec/PlistBuddy -c "add :Sockets:NetworkListener dict" com.apple.syslogd.plist
sudo /usr/libexec/PlistBuddy -c "add :Sockets:NetworkListener:SockServiceName string syslog" com.apple.syslogd.plist
sudo /usr/libexec/PlistBuddy -c "add :Sockets:NetworkListener:SockType string dgram" com.apple.syslogd.plist
sudo launchctl unload com.apple.syslogd.plist
sudo launchctl load com.apple.syslogd.plist
然而,我遇到的问题是,当我的路由器向 syslogd 发送消息时,这些消息会在 OS X 上的控制台中显示为来自未知 - 例如:
5/3/13 9:19:40.000 AM Unknown[-1]: [WAN-IN-6-A]IN=eth2 OUT=eth0 SRC=141.133.142.260 DST=10.0.00.10 LEN=64 TOS=0x00 PREC=0x00 TTL=53 ID=30298 DF PROTO=TCP SPT=60553 DPT=443 WINDOW=65535 RES=0x00 SYN URGP=0
而本地机器的日志消息指定了发送者:5/3/13 7:38:20.155 AM kdc[67]: LKDC 引用真实的 LKDC 域名
在远程日志主机上运行 tcpdump 显示发送的消息包含的信息比控制台中显示的信息更多:
router.example.com.38236 > server.example.com.syslog: SYSLOG, length: 258
Facility kernel (0), Severity warning (4)
Msg: May 3 09:12:39 router kernel: [WAN-LOCAL-default-D]IN=eth2 OUT= MAC=dc:ca:fe:ba:be:17:00:21:a0:ce:66:d9:07:00 SRC=86.86.123.381 DST=130.168.365.128 LEN=60 TOS=0x00 PREC=0x00 TTL=39 ID=26555 DF PROTO=TCP SPT=46635 DPT=62615 WINDOW=5840 RES=0x00 SYN URGP=0
09:12:45.557613 IP(tos 0x0、ttl 64、id 0、偏移量 0、标志 [DF]、proto UDP(17)、长度 286)
有人能告诉我如何在 OS X Mountain Lion 服务器上配置 syslog 以识别传入日志消息中的发件人并对其进行适当的分类吗?
答案1
我猜对于 OP 来说已经太晚了,但我可以报告我最近使用 OS X 10.10 Yosemite 的体验。
看起来你不能在 OS X 中配置 syslogd 来直接地识别发送者。事实上,一旦日志消息被接收到 ASL(Apple 系统日志)中,识别它们的唯一方法是因为它们有一些无意义的键:PID 是 0xFFFFFFFF+1,GID 和 UID 是 0xFFFFFFFF+2。当然,这种异常允许你间接识别 UDP 消息,因此您可以只抓取具有此类密钥的消息。但您仍然无法区分来自两个不同 UDP 源的日志消息。
在消息进入 ASL 之前,我们能做些什么吗?我还没有找到任何方法,而且我认为不可能,因为 syslogd/ASL 中的调试模式显示消息解析已经由 ASL 函数完成。
请注意,我在测试中使用 DD-WRT 路由器(Linux)作为 UDP 系统日志源,并且我没有尝试直接检查 UDP 数据包的内容;因此问题可能是 DD-WRT 发送格式错误的数据包。... 尽管我对此表示怀疑。
另外,我想说的是 OS X 的 syslogd/ASL 相当复杂且有缺陷(我已经发送了一个缺陷报告)。所以我建议放弃它们并尝试 syslog-ng。这将是我的下一步。
如果你仍然想尝试使用 OS X 的 syslogd,我在我的博客,包括如何将所有 UDP 传入消息转储到其自己的自动轮换日志文件中。