第一个问题的答案是:
是的,任何对syslog()的调用都被阻止。可能时间很短,但它仍然是涉及文件描述符的同步调用。请参阅man 3 syslog
以获取更多细节。
除非您的服务器使用异步体系结构和原语,否则总会有一些锁定。例如,通过使用单独的线程进行日志记录,可以缓解但不能消除这种情况。对于其他两个问题,我不是很清楚,但是检查rsyslogd源代码(以及对syslog()系列函数的源代码)是唯一了解的方法。
更一般而言,如果您通过UDP:514“网络系统日志协议”将日志记录移至外部服务器,则可以创建几乎为零的锁。随着一些记录可能丢失的缺点高负荷期间。
首先,在“原始”服务器中,您需要确保所有日志记录都是通过syslog进行的。例如,在Apache2中,您需要指定:
ErrorLog "syslog:daemon"
对于其他服务器,请参考正确的手册页。如果不能确保这一点,请记住登录文件系统可以创建
其次,在原始rsyslogd配置中,您要求将您选择的功能(此示例中为“守护程序”)的所有系统日志流量定向到一个或多个外部系统日志服务器。在rsyslog配置文件中,您可以指定:
daemon.* @192.168.128.1
daemon.* @192.168.254.1
将日志的两个副本同时发送到两个不同的服务器。
第三,在目标服务器中,启用通过UDP:514接收系统日志消息。它位于(目标)rsyslogd配置文件中,通常被defualt禁用(足以删除前导#:
$ModLoad imudp
$UDPServerRun 514
第四,可选但强烈建议,我还将启用高分辨率时间戳记:
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat
同样,默认情况下通常也禁用此选项(为什么在地球上?)。