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

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

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

CustomLog "|/usr/bin/logger -p local1.info  -t www_main" combined

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

问题在于,记录器会拆分任何长度超过 1024 字节的行并将它们作为单独的日志条目发送,这意味着某些日志条目最终会在日志记录框中的最终目标日志文件中的单独行上。

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

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

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

我还想了解解决长日志行被分割问题的其他方法,比如,一旦它们到达日志服务器,就使用 syslog-ng 将它们重新组合在一起的方法。

答案1

在进一步了解之后更新我的答案。

这似乎是的限制/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

4)http://www.oreillynet.com/pub/a/sysadmin/2006/10/12/httpd-syslog.html使用sys::syslog,似乎是 的合理替代方案/usr/bin/logger。您需要检查系统::系统日志同样的 1024 个字符限制。这是 Perl,应该很容易覆盖。

旧答案:

根据http://www.campin.net/syslog-ng/faq.html

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

选项 { log_msg_size(8192); };

答案2

最新版本的util-linuxprovidelogger可以接受--size参数:

--size size
    Sets the maximum permitted message size to size.
    The default is 1KiB characters, which is the limit traditionally used
    and specified in RFC 3164. With RFC 5424, this limit has become flexible.
    A good assumption is that RFC 5424 receivers can at least process 4KiB messages.

    Most receivers accept messages larger than 1KiB over any type of syslog protocol.
    As such, the --size option affects logger in all cases (not only when --rfc5424
    was used).

自 2.26 版以来,RFC 5424 协议一直是记录器的默认协议。

答案3

我个人会选择 InterSect Alliance 的免费产品。他们有一款专用的 Apache 产品(虽然比较旧)和一款更通用的产品,可以将任何基于文本的日志转换为 syslog 格式。

http://www.intersectalliance.com/projects/EpilogUNIX/index.html

答案4

我最近遇到了一个需要非常长的 Apache httpd 日志的客户(即使使用像 rsyslog 这样的现代 syslog 守护进程的旧版本也没有问题)。

为了解决这个问题,我logger用一些脚本语言创建了克隆,没有任何遗留的消息大小限制。参见:

GitHub:ryran/loggerclones——用可移植脚本语言重新实现的 nix logger 命令

相关内容