syslog

(PHP 4, PHP 5, PHP 7, PHP 8)

syslog生成系统日志消息

描述

syslog(int $priority, string $message): true

syslog() 生成一个日志消息,该消息将由系统日志记录器分发。

有关设置用户定义的日志处理程序的信息,请参见 syslog.conf (5) Unix 手册页。有关 syslog 功能和选项的更多信息,请参见 Unix 机器上的 syslog (3) 手册页。

参数

priority

priority 是设施和级别的组合。可能的值是

syslog() 优先级(按降序排列)
常量 描述
LOG_EMERG 系统不可用
LOG_ALERT 必须立即采取行动
LOG_CRIT 严重情况
LOG_ERR 错误情况
LOG_WARNING 警告条件
LOG_NOTICE 正常但重要的条件
LOG_INFO 信息消息
LOG_DEBUG 调试级别消息

message

要发送的消息。

返回值

始终返回 true

范例

范例 #1 使用 syslog()

<?php
// 打开 syslog,包含进程 ID,并将日志发送到标准错误,并使用用户定义的日志记录机制
openlog("myScriptLog", LOG_PID | LOG_PERROR, LOG_LOCAL0);

// 一些代码

if (authorized_client()) {
// 执行某些操作
} else {
// 未经授权的客户端!
// 记录尝试
$access = date("Y/m/d H:i:s");
syslog(LOG_WARNING, "Unauthorized client: $access {$_SERVER['REMOTE_ADDR']} ({$_SERVER['HTTP_USER_AGENT']})");
}

closelog();
?>

注释

在 Windows 上,syslog 服务使用事件日志进行模拟。

注意:

在 Windows 中,openlog()facility 参数不支持使用 LOG_LOCAL0LOG_LOCAL7

参见

添加注释

用户贡献的注释 18 个注释

james dot ellis at gmail dot com
16 年前
如果有人想知道为什么他们的日志消息会出现在多个日志文件中,这里有一个适用于 *nix 系统的答案

如果你的 syslog.conf 如下所示(假设你使用 LOG_LOCAL0 进行 Web 应用程序日志记录)

local0.info /var/log/web/info.log

这将收集 *所有* LOG_INFO 级别及以上的日志消息,即除了调试消息之外的所有消息

尝试使用以下方法,以确保只有指定日志级别的消息进入相应的日志文件

local0.=info /var/log/web/info.log

此外,您可能希望添加以下内容以确保您的消息不会出现在诸如“messages”,“all”,“syslog”和“debug”之类的通用日志文件中

local0.none /var/log/messages
local0.none /var/log/debug
等等

除了其他内容外,还可以节省磁盘空间 - 更多信息请参见“man syslog.conf”。
stevekamerman at gmail dot com
5 年前
此函数以 BSD Syslog RFC 3164 格式发送消息 (https://tools.ietf.org/html/rfc3164).

要查看 PHP 发送到日志套接字的原始消息,首先停止你的 syslog/rsylsog/ng-syslog 服务,然后使用 netcat-openbsd 包监听日志套接字

nc -U -l /dev/log

现在,从 PHP 记录一些内容

<?php
syslog
(LOG_LOCAL1|LOG_INFO, "Test from PHP");
?>

您将在 netcat 中看到 rfc3164 输出

<142>Oct 24 14:32:51 php: Test from PHP
OWM
4 年前
Syslog 自动检测换行符控制字符,因此会根据多行拆分消息。为了防止 PHP 7.3+ 中的这种行为,您可以使用未记录(目前)的 ini 设置

<?php

ini_set
('syslog.filter', 'raw');

# 更多信息请参见:https://bugs.php.net/bug.php?id=77913
Antonio Lobato
14 年前
警告:如果您使用 openlog() 来准备 syslog(),并且您的 Apache 线程接受多个请求,那么您 *必须* 调用 closelog(),如果 Apache 的错误日志配置为写入 syslog。如果未这样做,将导致 Apache 的错误日志写入 openlog 中使用的任何设施/标识。

例如,在 httpd.conf 中,您有

ErrorLog syslog:local7

而在 php 中,您执行

<?php
openlog
("myprogram", 0, LOG_LOCAL0);
syslog("My syslog message");
?>

从现在开始,此 Apache 线程将 ErrorLog 写入 local0 并在进程名称“myprogram”下,而不是 httpd!调用 closelog() 将解决此问题。
rgagnon24 at gmail dot com
5 年前
当在 Windows 上开发但在 Linux 上部署时,在另一个对象中使用 LOG_ 常量时,这让我困扰了一段时间。

Windows 将某些 LOG_ 常量评估为相同的值,而 LINUX 则不会。

需要注意的 8 个常量及其在平台上的差异

Linux 具有以下值
========================
LOG_EMERG = 0
LOG_ALERT = 1
LOG_CRIT = 2
LOG_ERR = 3
LOG_WARNING = 4
LOG_NOTICE = 5
LOG_INFO = 6
LOG_DEBUG = 7

而在 Windows 上,您有
==========================
LOG_EMERG = 1
LOG_ALERT = 1
LOG_CRIT = 1
LOG_ERR = 4
LOG_WARNING = 5
LOG_NOTICE = 6
LOG_INFO = 6
LOG_DEBUG = 6

因此,如果您在代码中设置 LOG_WARNING,Linux 将使用 4 作为优先级,而 Windows 将使用 5。

这不是 PHP 在任何平台上的错误,而是 PHP 编译所使用的系统头文件中的差异。您实际上无能为力,但请注意,如果您想知道为什么您的消息根据平台的不同而在不同的优先级上记录,这可能是原因。
Anonymous
2 年前
手动对消息进行时间戳没有意义(如文档示例所示),因为所有合理的日志记录系统都会自行对所有条目进行时间戳。
huangyg11 at gmail dot com
9 年前
对于那些想要同时写入多个 syslog 设施的人

syslog(LOG_INFO|LOG_LOCAL0, "message for local0");
syslog(LOG_INFO|LOG_LOCAL1, "message for local1");
helly at php dot net
17 年前
如果您使用的是 syslog-ng 并且希望将错误发送到 syslog,则使用 ini 设置 "error_log = syslog" 并将以下内容添加到您的 syslog-ng.conf 中

destination php { file("/var/log/php.log" owner(root) group(devel) perm(0620)); };
log { source(src); filter(f_php); destination(php); };
antoine dot leverve dot EXT at zodiacaerospace dot com
8 年前
文档中说 "优先级(降序)" 是不正确的,因为下面的表格实际上是按 **升序** 排列的。

例如,我的输出显示
LOG_ERR : 4
LOG_WARNING : 5
LOG_DEBUG : 6

一个重要的区别,给我造成了一些困扰!
daniele dot patoner at biblio dot unitn dot it
20 年前
这对我有效,将日志重定向到一个单独的 syslog 文件

将此行添加到您的 /etc/syslog.conf 中

local0.debug /var/log/php.log

然后重启 syslogd

/etc/init.d/syslog restart

php 示例

<?php
define_syslog_variables
();
openlog("TextLog", LOG_PID, LOG_LOCAL0);

$data = date("Y/m/d H:i:s");
syslog(LOG_DEBUG,"Messagge: $data");

closelog();
?>
mavetju at chello dot nl
23 年前
在 FreeBSD 中,我可以使用:syslog(LOG_INFO,"test");

BSD/OS 不支持此功能,我不得不使用优先级的字面值(158: local3.info)
syslog(158,"test");
gregj at pdxperts dot com
21 年前
发送到日志文件的邮件字符串长度限制为 500 个字符。
dpreece at paradise dot net dot nz
22 年前
要通过 syslog 守护进程(在本例中为 FreeBSD)设置自定义日志文件...

在 /etc/syslog.conf 中添加一行,表示来自 httpd 进程的所有错误都将发送到一个名为(例如)/var/log/httpd-php.log 的文件

!httpd
*.* {tab} /var/log/httpd-php.log

注意制表符,它是一个制表符字符!接下来创建一个空白文件以供写入。我相信有很多方法可以做到,但我选择

# cat > httpd-php.log << EOF
? EOF

最后找到您的 syslog 守护进程,并向其发送一个 sighup 信号以通知它更改

# ps ax | grep syslogd
133 ?? Ss 0:07.23 syslogd -s
# kill -1 133

就这样!PHP syslog 调用现在将到达 /var/log/httpd-php.log
bb at lb-data dot co dot at
24 年前
在 Windows NT 中,使用以下优先级值
1 = error,
6 = info
Torsten
20 年前
我尝试在 Windows XP 下使用 IIS 5.1 发出 syslog 消息时遇到了问题。函数调用似乎成功了,但事件查看器显示没有创建条目。
最后我发现用于 web 服务器的用户帐户 (IUSR_<计算机名称>) 没有足够的权限来发出 syslog 警告。我通过将此用户添加到 Users 组(而不是仅仅是 Guest 组)来更改此设置。
rcgraves+php at brandeis dot edu
24 年前
对于启用头文件的

man 3 syslog 定义了优先级,但没有定义整数值。为此,您需要阅读系统的头文件。

假设我想在邮件日志中记录一条信息性消息(这恰好是真的)。手册页告诉我我需要 LOG_MAIL|LOG_INFO。因此我在 /usr/include/sys/syslog.h 中找到(这恰好是 Linux,您的系统可能不同)

#define LOG_INFO 6 /* informational */
#define LOG_MAIL (2<<3) /* mail system */

2<<3 表示将 3 位向左移,这意味着乘以 8。所以我要 2*8 + 6 = 22。syslog(22,"this message will appear in the mail log"); 它确实出现了。
adam _at_ lockdownnetworks _dot_ com
17 年前
请注意,在使用 syslog() 时,如果您将环境的时区设置为标准时区以外的时区,syslog() 可能将时间记录到日志中,但时区信息错误。例如

<?php

openlog
('mylog', LOG_PID | LOG_ODELAY,LOG_LOCAL4);

putenv('TZ=UTC');
syslog(LOG_INFO, 'UTC Log line');

putenv('TZ=US/Pacific');
syslog(LOG_INFO, 'US/Pacific Log line');

closelog();

?>

查看 /usr/log/messages 日志将显示这两行

Apr 11 01:25:39 hostname mylog[1400]: UTC Log line
Apr 10 18:25:39 hostname mylog[1400]: US/Pacific Log line

Adam。
gherson at snet dot net
23 年前
syslog 输出位置示例:/var/log/httpd/access_log
(在 Red Hat Linux Secure Server v6.2 上)。
To Top