Sys::Syslog - Perl 对 UNIX syslog(3) 调用的接口
这是版本 0.36 的文档
use Sys::Syslog; # all except setlogsock()
use Sys::Syslog qw(:standard :macros); # standard functions & macros
openlog($ident, $logopt, $facility); # don't forget this
syslog($priority, $format, @args);
$oldmask = setlogmask($mask_priority);
closelog();
Sys::Syslog 是对 UNIX syslog(3) 程序的接口。使用字符串优先级和 printf() 参数列表调用 syslog(),就像 syslog(3) 一样。
Sys::Syslog 导出以下 Exporter 标签
:standard 导出标准 syslog(3) 函数
openlog closelog setlogmask syslog
:extended 导出针对 syslog(3) 的 Perl 特定函数
setlogsock
:macros 导出与大多数 syslog(3) 宏以及 LOG_UPTO() 和 LOG_MASK() 函数相对应的符号。有关支持的常量及其含义,请参见 "常量"。
默认情况下,Sys::Syslog 导出 :standard 标签中的符号。
打开系统日志。$ident 会被添加到每条消息的前面。$logopt 包含一个或多个下面详细说明的选项。$facility 指定要报告的系统部分,例如 LOG_USER 或 LOG_LOCAL0:有关常用设施的列表,请参阅 "设施",有关系统中可用的设施,请参阅 syslog(3) 文档。查看 "参见" 获取有用链接。设施可以作为字符串或数字宏给出。
如果无法连接到系统日志守护进程,此函数将报错。
请注意,openlog() 现在接受三个参数,就像 openlog(3) 一样。
在调用 syslog() 之前,您应该使用 openlog()。
选项
cons - 此选项被忽略,因为如果所有其他介质都失败,故障转移机制将自动降级到控制台。
ndelay - 立即打开连接(通常,连接在记录第一条消息时打开)。
noeol - 当设置为 true 时,不会在消息末尾添加换行符 (\n)。这对于某些系统日志守护进程可能很有用。在 Sys::Syslog 0.29 中添加。
nofatal - 当设置为 true 时,如果无法建立与系统日志的连接,openlog() 和 syslog() 将只发出警告,而不是退出。在 Sys::Syslog 0.15 中添加。
nonul - 当设置为 true 时,不会在消息末尾添加 NUL 字符 (\0)。这对于某些系统日志守护进程可能很有用。在 Sys::Syslog 0.29 中添加。
nowait - 不要等待可能在记录消息时创建的子进程。(GNU C 库不会创建子进程,因此此选项对 Linux 无效。)
perror - 将消息写入标准错误输出以及系统日志。在 Sys::Syslog 0.22 中添加。
pid - 在每条消息中包含 PID。
示例
使用选项 ndelay 和 pid 打开系统日志,并使用设施 LOCAL0
openlog($name, "ndelay,pid", "local0");
相同的事情,但这次使用与 LOCAL0 相对应的宏
openlog($name, "ndelay,pid", LOG_LOCAL0);
如果 $priority 允许,则记录 $message 或 sprintf($format, @args),另外,$message 或 $format 中的 %m 将被替换为 "$!"(最新的错误消息)。
$priority 可以指定级别或级别和设施。级别和设施可以作为字符串或宏给出。使用 eventlog 机制时,优先级 DEBUG 和 INFO 映射到事件类型 informational,NOTICE 和 WARNING 映射到 warning,ERR 和 EMERG 映射到 error。
如果您在使用 syslog() 之前没有使用 openlog(),syslog() 将尝试通过提取 $format 中以 ":" 结尾的最短前缀来猜测 $ident。
示例
# informational level
syslog("info", $message);
syslog(LOG_INFO, $message);
# information level, Local0 facility
syslog("info|local0", $message);
syslog(LOG_INFO|LOG_LOCAL0, $message);
Sys::Syslog 版本 v0.07 及更早版本将 $message 作为格式化字符串传递给 sprintf(),即使没有提供格式化参数也是如此。如果调用 syslog() 的代码可能与该模块的旧版本一起执行,请确保将函数调用为 syslog($priority, "%s", $message) 而不是 syslog($priority, $message)。这可以防止恶意格式化序列在 $message 包含受污染的数据时出现。
将当前进程的日志掩码设置为$mask_priority,并返回旧的掩码。如果掩码参数为 0,则不会修改当前日志掩码。有关可用级别的列表,请参见"级别"。可以使用LOG_UPTO()函数允许所有级别(但它只接受数字宏作为参数)。
示例
仅记录错误
setlogmask( LOG_MASK(LOG_ERR) );
记录除信息消息之外的所有内容
setlogmask( ~(LOG_MASK(LOG_INFO)) );
记录严重消息、错误和警告
setlogmask( LOG_MASK(LOG_CRIT)
| LOG_MASK(LOG_ERR)
| LOG_MASK(LOG_WARNING) );
记录所有消息,直到调试
setlogmask( LOG_UPTO(LOG_DEBUG) );
设置用于下一次调用openlog()或syslog()的套接字类型和选项。成功时返回 true,失败时返回undef。
作为 Perl 特定的函数,它随着时间的推移而发展。目前可以按如下方式调用它
setlogsock($sock_type)
setlogsock($sock_type, $stream_location)(在 Perl 5.004_02 中添加)
setlogsock($sock_type, $stream_location, $sock_timeout)(在Sys::Syslog 0.25 中添加)
setlogsock(\%options)(在Sys::Syslog 0.28 中添加)
可用的选项是
type - 等效于$sock_type,选择套接字类型(或“机制”)。可以传递数组引用来指定要尝试的几种机制,按给定的顺序。
path - 等效于$stream_location,设置流位置。默认为标准 Unix 位置,或_PATH_LOG。
timeout - 等效于$sock_timeout,设置套接字超时时间(以秒为单位)。在所有系统上默认为 0,除了Mac OS X,它设置为 0.25 秒。
host - 设置要发送消息的主机名。默认为本地主机。
port - 设置要连接到的 TCP 或 UDP 端口。默认为系统上第一个可用的标准 syslog 端口。
可用的机制是
"native" - 使用来自syslog(3) 库的本机 C 函数(在Sys::Syslog 0.15 中添加)。
"eventlog" - 将消息发送到 Win32 事件记录器(仅限 Win32;在Sys::Syslog 0.19 中添加)。
"tcp" - 连接到 TCP 套接字,在syslog/tcp 或syslogng/tcp 服务上。另请参见host、port 和timeout 选项。
"udp" - 连接到 UDP 套接字,在syslog/udp 服务上。另请参见host、port 和timeout 选项。
"inet" - 连接到 INET 套接字,TCP 或 UDP,按此顺序尝试。另请参见host、port 和timeout 选项。
"unix" - 连接到 UNIX 域套接字(在某些系统中为字符特殊设备)。该套接字的名称由path 选项给出,如果省略,则由_PATH_LOG 宏(如果您的系统定义了它)返回的值,/dev/log 或/dev/conslog,以可写者为准。
"stream" - 连接到由 path 选项指示的流,或者,如果省略,则连接到由 _PATH_LOG 宏返回的值(如果您的系统定义了它),/dev/log 或 /dev/conslog,以可写者为准。例如,Solaris 和 IRIX 系统可能更喜欢 "stream" 而不是 "unix"。
"pipe" - 连接到由 path 选项指示的命名管道,或者,如果省略,则连接到由 _PATH_LOG 宏返回的值(如果您的系统定义了它),或 /dev/log(在 Sys::Syslog 0.21 中添加)。HP-UX 是使用此类命名管道的系统。
"console" - 将消息直接发送到控制台,如 openlog() 的 "cons" 选项。
默认情况下,将尝试 native、tcp、udp、unix、pipe、stream、console。在具有 Win32 API 的系统下,如果 Win32::EventLog 可用,则会将 eventlog 添加为第一个尝试的机制。
为 $sock_type 提供无效值将 croak。
示例
选择 UDP 套接字机制
setlogsock("udp");
使用 TCP 套接字机制在自定义端口上发送消息
setlogsock({ type => "tcp", port => 2486 });
使用 TCP 套接字机制将消息发送到远程主机
setlogsock({ type => "tcp", host => $loghost });
尝试本机、UDP 套接字然后 UNIX 域套接字机制
setlogsock(["native", "udp", "unix"]);
现在 Sys::Syslog 支持 "native" 机制,并且默认情况下选择它,因此不鼓励使用 setlogsock() 函数,因为其他机制在不同操作系统之间的可移植性较差。使用此函数的模块和程序的作者,尤其是其货物崇拜形式 setlogsock("unix"),建议删除所有出现此函数的地方,除非他们特别想使用给定的机制(如 TCP 或 UDP 连接到远程主机)。
关闭日志文件,并在成功时返回 true。
Sys::Syslog 的第一条规则是:你不能调用 setlogsock。
Sys::Syslog 的第二条规则是:你不能调用 setlogsock。
Sys::Syslog 的第三条规则是:程序崩溃、die、调用 closelog,日志结束。
Sys::Syslog 的第四条规则是:一个设施,一个优先级。
Sys::Syslog 的第五条规则是:一次一个日志。
Sys::Syslog 的第六条规则是:在 openlog 之前没有 syslog。
Sys::Syslog 的第七条规则是:日志将持续下去,只要它们需要。
Sys::Syslog 的第八条也是最后一条规则是:如果您是第一次使用 Sys::Syslog,您必须阅读文档。
一个例子
openlog($program, 'cons,pid', 'user');
syslog('info', '%s', 'this is another test');
syslog('mail|warning', 'this is a better test: %d', time);
closelog();
syslog('debug', 'this is the last test');
另一个例子
openlog("$program $$", 'ndelay', 'user');
syslog('notice', 'fooprogram: this is really done');
%m 使用示例
$! = 55;
syslog('info', 'problem was %m'); # %m == $! in syslog(3)
将日志记录到 $remotehost 上的 UDP 端口,而不是本地记录
setlogsock("udp", $remotehost);
openlog($program, 'ndelay', 'user');
syslog('info', 'something happened over here');
LOG_AUDIT - 审计守护进程 (IRIX);回退到 LOG_AUTH
LOG_AUTH - 安全/授权消息
LOG_AUTHPRIV - 安全/授权消息(私有)
LOG_CONSOLE - /dev/console 输出 (FreeBSD);回退到 LOG_USER
LOG_CRON - 时钟守护进程 (cron 和 at)
LOG_DAEMON - 没有单独设施值的系统守护进程
LOG_FTP - FTP 守护进程
LOG_KERN - 内核消息
LOG_INSTALL - 安装程序子系统 (Mac OS X);回退到 LOG_USER
LOG_LAUNCHD - launchd - 通用引导守护进程 (Mac OS X);回退到 LOG_DAEMON
LOG_LFMT - logalert 设施;回退到 LOG_USER
LOG_LOCAL0 到 LOG_LOCAL7 - 保留供本地使用
LOG_LPR - 行式打印机子系统
LOG_MAIL - 邮件子系统
LOG_NETINFO - NetInfo 子系统 (Mac OS X);回退到 LOG_DAEMON
LOG_NEWS - USENET 新闻子系统
LOG_NTP - NTP 子系统 (FreeBSD, NetBSD);回退到 LOG_DAEMON
LOG_RAS - 远程访问服务 (VPN / PPP) (Mac OS X);回退到 LOG_AUTH
LOG_REMOTEAUTH - 远程身份验证/授权 (Mac OS X);回退到 LOG_AUTH
LOG_SECURITY - 安全子系统(防火墙等)(FreeBSD);回退到 LOG_AUTH
LOG_SYSLOG - 由 syslogd 内部生成的邮件
LOG_USER(默认) - 通用用户级邮件
LOG_UUCP - UUCP 子系统
LOG_EMERG - 系统不可用
LOG_ALERT - 必须立即采取行动
LOG_CRIT - 严重情况
LOG_ERR - 错误情况
LOG_WARNING - 警告条件
LOG_NOTICE - 正常但重要的条件
LOG_INFO - 信息消息
LOG_DEBUG - 调试级别消息
传递给 setlogsock 的参数无效(F) 您为 setlogsock() 提供了 $sock_type 的无效值。
将 eventlog 传递给 setlogsock,但没有可用的 Win32 API(W) 您要求 setlogsock() 使用 Win32 事件记录器,但运行程序的操作系统不是 Win32 或不提供与 Win32 兼容的功能。
无法连接到 syslog(F) syslog() 无法连接到指定的套接字。
将流传递给 setlogsock,但 %s 不可写(W) 您要求 setlogsock() 使用流套接字,但给定的路径不可写。
将流传递给 setlogsock,但找不到任何设备(W) 您要求 setlogsock() 使用流套接字,但没有提供路径,并且 Sys::Syslog 无法找到合适的路径。
(W) 您要求 setlogsock() 使用 TCP 套接字,但系统上该服务不可用。
syslog:需要参数 %s(F) 您忘记为 syslog() 提供指示的参数。
syslog:级别/设施无效:%s(F) 您指定了无效的级别或设施。
syslog: too many levels given: %s(F) 您指定了太多级别。
syslog: too many facilities given: %s(F) 您指定了太多设施。
syslog: level must be given(F) 您忘记指定级别。
(W) 您要求 setlogsock() 使用 UDP 套接字,但系统上该服务不可用。
unix passed to setlogsock, but path not available(W) 您要求 setlogsock() 使用 UNIX 套接字,但 Sys::Syslog 无法找到合适的设备。
Sys::Syslog 是一个核心模块,自 1990 年起就成为标准 Perl 发行版的一部分。当时,我们所知的模块还不存在,Perl 库是一组 .pl 文件,用于发送 syslog 消息的文件只是 lib/syslog.pl,包含在 Perl 3.0 中。它在 Perl 5.0 中被转换为模块,但只有从 Perl 5.6 开始才具有版本号。以下是一个小型表格,列出了匹配的 Perl 和 Sys::Syslog 版本。
Sys::Syslog Perl
----------- ----
undef 5.0.0 ~ 5.5.4
0.01 5.6.*
0.03 5.8.0
0.04 5.8.1, 5.8.2, 5.8.3
0.05 5.8.4, 5.8.5, 5.8.6
0.06 5.8.7
0.13 5.8.8
0.22 5.10.0
0.27 5.8.9, 5.10.1 ~ 5.14.*
0.29 5.16.*
0.32 5.18.*
0.33 5.20.*
0.33 5.22.*
Log::Log4perl - Perl 对 Log4j API 的实现
Log::Dispatch - 将消息分派到一个或多个输出
Log::Report - 报告问题,包括异常和语言支持
SUSv3 第 6 版,IEEE Std 1003.1,2004 年版,http://www.opengroup.org/onlinepubs/000095399/basedefs/syslog.h.html
GNU C 库关于 syslog 的文档,https://gnu.ac.cn/software/libc/manual/html_node/Syslog.html
FreeBSD 关于 syslog 的文档,https://www.freebsd.org/cgi/man.cgi?query=syslog
Solaris 11 关于 syslog 的文档,https://docs.oracle.com/cd/E53394_01/html/E54766/syslog-3c.html
Mac OS X 关于 syslog 的文档,http://developer.apple.com/documentation/Darwin/Reference/ManPages/man3/syslog.3.html
IRIX 关于 syslog 的文档,http://nixdoc.net/man-pages/IRIX/man3/syslog.3c.html
AIX 5L 5.3 系统日志文档,http://publib.boulder.ibm.com/infocenter/pseries/v5r3/index.jsp?topic=/com.ibm.aix.basetechref/doc/basetrf2/syslog.htm
HP-UX 11i 系统日志文档,http://docs.hp.com/en/B2355-60130/syslog.3C.html
Tru64 系统日志文档,http://nixdoc.net/man-pages/Tru64/man3/syslog.3.html
Stratus VOS 15.1,http://stratadoc.stratus.com/vos/15.1.1/r502-01/wwhelp/wwhimpl/js/html/wwhelp.htm?context=r502-01&file=ch5r502-01bi.html
RFC 3164 - BSD syslog 协议,http://www.faqs.org/rfcs/rfc3164.html -- 请注意,这是一个信息性 RFC,因此不指定任何标准。
RFC 3195 - syslog 的可靠传递,http://www.faqs.org/rfcs/rfc3195.html
使用 Perl 进行系统日志记录,http://lexington.pm.org/meetings/022001.html
Windows 事件日志,http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wes/wes/windows_event_log.asp
Tom Christiansen <tchrist (at) perl.com> 和 Larry Wall <larry (at) wall.org>。
UNIX 域套接字由 Sean Robinson <robinson_s (at) sc.maricopa.edu> 添加,并得到 Tim Bunce <Tim.Bunce (at) ig.co.uk> 和 perl5-porters 邮件列表的支持。
对 syslog.ph 的依赖由 Tom Hughes <tom (at) compton.nu> 用 XS 代码替换。
constant() 的代码由 Nicholas Clark <nick (at) ccl4.org> 重新生成。
故障转移到不同的通信模式由 Nick Williams <Nick.Williams (at) morganstanley.com> 完成。
从核心发行版中提取出来,并在 CPAN 上发布,由 Sébastien Aperghis-Tramoni <sebastien (at) aperghis.net> 完成。
使用原生 C 函数的 XS 代码借鉴自 Unix::Syslog,由 Marcus Harnisch <marcus.harnisch (at) gmx.net> 编写。
Yves Orton 建议并帮助 Sys::Syslog 在 Win32 系统下使用原生事件记录器。
Jerry D. Hedden 和 Reini Urban 在 Cygwin 下调试和完善 Sys::Syslog 提供了非常宝贵的帮助。
请将任何错误或功能请求报告给 bug-sys-syslog (at) rt.cpan.org,或通过网页界面报告至 http://rt.cpan.org/Public/Dist/Display.html?Name=Sys-Syslog。我会收到通知,然后您会在我对错误进行更改时自动收到进度通知。
您可以使用 perldoc 命令查找此模块的文档。
perldoc Sys::Syslog
您也可以在以下位置查找信息:
Perl 文档
MetaCPAN
搜索 CPAN
AnnoCPAN:带注释的 CPAN 文档
CPAN 评分
RT:CPAN 的请求跟踪器
源代码可在 Git Hub 上获取:https://github.com/maddingue/Sys-Syslog/
版权所有 (C) 1990-2012 Larry Wall 及其他。
本程序是自由软件;您可以根据与 Perl 本身相同的条款重新发布和/或修改它。