我们目前使用logging器来获取我们的Apache访问日志到syslog-ng,并在每个虚拟主机中使用这样一行:
CustomLog "|/usr/bin/logger -p local1.info -t www_main" combined
似乎几乎所有关于Apache和syslog-ng的教程或build议都使用此方法将日志获取到syslog-ng中。 ( 例子 )。 其余的使用命名pipe道和pipe道()源。 ( 例子 )。
这样做的麻烦在于,logging器会拆分超过1024个字节的所有行,并将它们作为单独的日志条目发送,这意味着某些日志条目会在日志logging框上的最终目标日志文件的单独行中结束。
使用命名pipe道和syslog-ng中的pipe()源可以解决分割线问题,但会带来一系列小问题和烦恼。 举几个例子,命名pipe道必须在Apache和syslog-ng都启动之前创build,syslog-ng必须在Apache启动之前启动并且标记日志(上面用-t完成)现在必须在syslog-ngconfiguration文件而不是在vhost中。
本页build议编写一个简短的Perl脚本来代替/ usr / bin / logger。
我想知道是否有人知道任何logging器的替代品,最好用本地编译的语言编写,或者可能是不把长线分成两半的更新版本的logging器。
我也有兴趣听到任何其他解决长日志行被拆分的问题的解决办法,例如一旦他们到达日志服务器,使用syslog-ng将它们重新组合起来。
更深入地研究这个问题之后更新我的答案
这似乎与/usr/bin/logger有一定的限制,预计会符合系统日志RFC。 http://www.faqs.org/rfcs/rfc3164.html说:
数据包的总长度必须是1024个字节或更less。
如果你通过命令行(在Apache之外)发送超过1024个字符到系统日志,你会遇到同样的限制。
请记住,1024个字符的限制可能在其他地方存在。 我认为一个HTTP GET的最大大小是1024个字符,我似乎记得一些printf库例程有1024个字符的硬限制(几年前有一个关于某些syslog /string的1024个字符限制的安全警告打印工具,如果我没记错的话)。 所以,你的select似乎是:
3)尝试停止写入长日志消息的HTTP应用程序。 这说起来容易。 1)重新编译logger并增加这个限制。 如果你这样做,请记住,你正在改变核心工具,这可能会导致意外的行为。 为了缓解这个问题,把这个工具放在/ usr / local / bin或/ opt / bin中。 不要replace/usr/bin/logger 。 2)不要从Apache发送到系统日志。 像下面的东西应该围绕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一个合理的select。 你需要检查sys :: syslog这个1024个字符的限制。 这是Perl,应该很容易覆盖。
老答案:
看起来这个限制是可以在syslog-ng中调整的,根据http://www.campin.net/syslog-ng/faq.html
系统日志默认为1024字节长的消息,但是这个值是可以在syslog-ng 1.5中调整的,在这里你可以设置一个更高的值。
options {log_msg_size(8192); };
最近版本的util-linux提供了能够使用--size参数的logger :
--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协议是logging器的默认设置。
我个人去为这个InterSect联盟的免费产品。 他们有一个专用的Apache产品 – 尽pipe是旧的 – 而且是一个更通用的产品,可以将任何基于文本的日志转换为系统日志格式。
http://www.intersectalliance.com/projects/EpilogUNIX/index.html
最近我遇到了一个需要很长时间的Apache httpd日志的客户(即使是像rsyslog这样的现代syslog守护进程的旧版本也没有问题)。
为了解决这个问题,我在一些脚本语言中创build了logger克隆,没有任何传统的消息大小限制。 看到:
GitHub:ryran / loggerclones – 以可移植脚本语言重新实现nix logger命令