用于从 Apache 获取日志到 syslog-ng 的 /usr/bin/logger 的替代方法

Lad*_*ada 5 syslog-ng apache-2.2

我们目前使用 logger 将我们的 Apache 访问日志获取到 syslog-ng,在每个 vhost 中使用如下一行:

CustomLog "|/usr/bin/logger -p local1.info  -t www_main" combined
Run Code Online (Sandbox Code Playgroud)

似乎我能找到的几乎所有关于 Apache 和 syslog-ng 的教程或建议都使用这种方法将日志导入 syslog-ng。(示例)。其余的使用命名管道和 pipe() 源。(示例)。

这样做的问题是 logger 拆分任何超过 1024 字节的行并将它们作为单独的日志条目发送,这意味着某些日志条目在日志框的最终目标日志文件中以不同的行结束。

在 syslog-ng 中使用命名管道和 pipe() 源解决了分割线问题,但也带来了一些小问题和烦恼。举几个例子,命名管道必须在 Apache 和 syslog-ng 启动之前创建,syslog-ng 必须在 Apache 启动之前启动,并且标记日志(上面用 完成-t)现在必须在 syslog 中完成-ng 配置文件而不是在 vhost 中。

本页建议编写一个简短的 Perl 脚本来代替 /usr/bin/logger。

我想知道是否有人知道记录器的任何替代方案,最好用本地编译语言编写,或者可能是不将长行分成两半的记录器的更新版本。

我也有兴趣听到有关长日志行被拆分问题的任何其他解决方案,例如在它们到达日志服务器后使用 syslog-ng 将它们组合在一起的方法。

Ste*_*ski 3

更多研究后更新我的答案。

这似乎是 的限制/usr/bin/logger,预计符合 syslog RFC。 http://www.faqs.org/rfcs/rfc3164.html说:

数据包的总长度必须为 1024 字节或更小。

如果您通过命令行(Apache 之外)向 syslog 发送超过 1024 个字符,您将遇到同样的限制。

请记住,1024 个字符的限制可能存在于其他地方。我认为 HTTP GET 的最大大小是 1024 个字符,并且我似乎记得某些 printf 库例程具有 1024 个字符的硬限制(几年前有一个关于某些 syslog/ 字符串的 1024 个字符限制的安全警报)打印实用程序,如果我没记错的话)。所以,看来你的选择是:

3) 尝试阻止您的 HTTP 应用程序写入长日志消息。这说起来容易做起来难。1) 重新编译logger并增加此限制。如果您这样做,请记住您正在更改核心实用程序,这可能会导致意外行为。为了缓解这种情况,请将此实用程序放在 /usr/local/bin 或 /opt/bin 中。不要更换/usr/bin/logger。2) 不要从 Apache 发送到 syslog。类似下面的内容应该可以解决 1024 个字符的限制,因为它不使用 syslog。

CustomLog logs/access_log
Run Code Online (Sandbox Code Playgroud)

4)http://www.oreillynet.com/pub/a/sysadmin/2006/10/12/httpd-syslog.html使用sys::syslog并且似乎是/usr/bin/logger. 您需要检查sys::syslog是否有同样的 1024 个字符限制。它是 Perl,并且应该很容易重写。

旧答案:

根据http://www.campin.net/syslog-ng/faq.html,这个限制似乎可以在 syslog-ng 中调整

syslog 默认为 1024 字节长消息,但该值在 syslog-ng 1.5 中是可调的,您可以将其设置为更高的值。

选项 { log_msg_size(8192); };