ZetCode

PHP syslog 函数

最后修改于 2025 年 4 月 4 日

PHP syslog 函数将日志消息发送到系统日志记录器。它对于应用程序和服务的集中式日志记录非常有用。

基本定义

syslog 会生成一条系统日志消息,由系统日志记录守护进程处理。它遵循标准的 syslog 协议。

语法:syslog(int $priority, string $message): bool。成功时返回 true,失败时返回 false。需要适当的系统权限。

基本日志记录示例

此示例演示了使用 syslog 记录消息的最简单方法。

basic_logging.php
<?php

declare(strict_types=1);

// Open connection to system logger
openlog("myapp", LOG_PID | LOG_PERROR, LOG_LOCAL0);

// Send a log message
syslog(LOG_INFO, "Application started successfully");

// Close connection
closelog();

此代码打开与系统日志记录器的连接,发送一条 INFO 级别消息,然后关闭连接。该消息会出现在系统日志中。

不同的优先级级别

此示例展示了如何使用不同的优先级级别进行日志记录。

priority_levels.php
<?php

declare(strict_types=1);

openlog("myapp", LOG_PID, LOG_USER);

syslog(LOG_EMERG, "System is unusable");
syslog(LOG_ALERT, "Immediate action required");
syslog(LOG_CRIT, "Critical conditions");
syslog(LOG_ERR, "Error conditions");
syslog(LOG_WARNING, "Warning conditions");
syslog(LOG_NOTICE, "Normal but significant");
syslog(LOG_INFO, "Informational message");
syslog(LOG_DEBUG, "Debug-level message");

closelog();

每个优先级级别表示消息的严重程度。系统管理员可以根据这些优先级过滤日志以获得更好的监控。

使用自定义设施进行日志记录

此示例演示了使用自定义日志记录设施进行分类。

custom_facility.php
<?php

declare(strict_types=1);

// Using local7 facility typically reserved for local use
openlog("customapp", LOG_PID | LOG_ODELAY, LOG_LOCAL7);

syslog(LOG_NOTICE, "Custom application initialized");
syslog(LOG_WARNING, "Configuration file missing");

closelog();

设施有助于按来源对日志进行分类。不同的设施可以具有不同的日志文件目标和处理规则。

使用 syslog 进行错误处理

此示例展示了如何将 PHP 错误记录到系统日志记录器。

error_handling.php
<?php

declare(strict_types=1);

function logError($errno, $errstr, $errfile, $errline) {
    openlog("phperrors", LOG_PID, LOG_LOCAL0);
    $priority = match($errno) {
        E_ERROR, E_USER_ERROR => LOG_ERR,
        E_WARNING, E_USER_WARNING => LOG_WARNING,
        E_NOTICE, E_USER_NOTICE => LOG_NOTICE,
        default => LOG_INFO
    };
    syslog($priority, "[$errno] $errstr in $errfile on line $errline");
    closelog();
}

set_error_handler("logError");

// Trigger different error types
trigger_error("Test warning", E_USER_WARNING);
trigger_error("Test notice", E_USER_NOTICE);

这会设置一个自定义错误处理程序,将 PHP 错误记录到 syslog。错误会按严重程度分类,并包含详细的上下文信息。

结构化日志记录

此示例演示了带有附加元数据的结构化日志记录。

structured_logging.php
<?php

declare(strict_types=1);

function logEvent($message, $context = [], $priority = LOG_INFO) {
    openlog("structuredapp", LOG_PID, LOG_LOCAL0);
    
    $structured = [
        'message' => $message,
        'timestamp' => date('c'),
        'context' => $context
    ];
    
    syslog($priority, json_encode($structured));
    closelog();
}

logEvent("User logged in", [
    'user_id' => 42,
    'ip' => '192.168.1.1',
    'user_agent' => $_SERVER['HTTP_USER_AGENT'] ?? 'unknown'
]);

结构化日志记录将消息格式化为 JSON,并附带附加上下文。这使得日志更易于机器读取,并支持更好的日志分析工具。

最佳实践

来源

PHP syslog 文档

本教程涵盖了 PHP syslog 函数,并提供了各种场景下系统日志记录的实用示例。

作者

我的名字是 Jan Bodnar,我是一名充满热情的程序员,拥有丰富的编程经验。自 2007 年以来,我一直在撰写编程文章。至今,我已撰写了 1400 多篇文章和 8 本电子书。我在编程教学方面拥有十多年的经验。

列出 所有 PHP 网络函数