【问题标题】:Sending PHP syslog to a specific Linux log file将 PHP syslog 发送到特定的 Linux 日志文件
【发布时间】:2023-04-10 11:59:01
【问题描述】:

我正在使用 PHP 5.5.14 运行 Centos/Apache,并且正在使用 syslog 写入日志文件,如下所示:

syslog(LOG_INFO,'Some message');

日志正在写入/var/log/messages,看起来像Aug 10 15:48:16 devserver httpd: Some message,但是,日志文件中也有一堆看起来像Aug 10 15:48:21 devserver kernel: usb 1-1.2: USB disconnect, device number 83的日志。

如何让 PHP 将日志发送到自己的专用日志文件中?

【问题讨论】:

  • $_SERVER['Some message'] 是什么意思? $_SERVER 超全局使用大写的键名来表示环境和 HTTP 请求标头等数据,因此当您尝试将 Some message 作为键查找时会有些混乱。
  • @Jailout2000。你是对的。那是一个错字。原帖已修复。
  • 可能值得考虑使用 MonoLog 来处理您的日志记录需求,它可以减少设置日志记录的痛苦,并且还提供各种日志记录选项

标签: php linux apache logging centos


【解决方案1】:

在调用函数syslog之前,你应该调用openlog 并指定“syslog标签”。使用此框架,消息被标记,您可以使用系统记录器(rsyslog、syslog-ng 等)将这些消息发送到特定的日志文件,将它们发送到特定的日志服务器,发送紧急消息的电子邮件,等等

blog post “Using syslog for your php applications” 提供了有关如何设置整个事情的更多详细信息。

【讨论】:

    【解决方案2】:

    Syslog 将数据转储到单个日志文件中。许多系统服务,甚至您指出的内核,都转储到 syslog,并且通过扩展,转储到同一个日志文件。

    如果您想利用自己的个人日志文件,则需要使用文件系统 IO 函数。

    例子:

    <?php
    
    function writeLog($message) {
      $handle = fopen('/var/log/project1/myproject1.log', 'a');
      $line   = '[' . date('Y-m-d H:i:s T') . '] ' . $message . "\n";
      fwrite($handle, $line);
      fclose($handle);
    }
    

    你应该注意确保你不要fopen() 然后fclose() 很多,因为这会严重减慢你的代码。您应该只在需要写入/读取时fopen(),然后让文件句柄保持打开状态,直到您的 PHP 代码退出(或让 PHP 为您进行垃圾收集)。

    您还需要确保您的网络服务器有足够的权限写入/var/log/project1/ 目录,或者至少对指定的文件名具有附加/写入权限。这包括确保 SELinux 在您启用它的情况下感到满意。

    作为奖励,您可以将自定义日志文件放入 logrotate 守护程序的配置中,让您的日志自动旋转、压缩、存档等等。

    【讨论】:

    • 当您每次调用都打开和关闭文件时,这将产生糟糕的性能。我知道您在回答中已经说明了这一点,但是还有比这更好的记录方法。
    • @GordonM 我希望更高级的应用程序通过网络发送日志,而不是每次调用都将日志发送到磁盘,例如发送到 zeromq 或其他异步 I/O 服务器,以便使用并存储到以后有更多永久存储空间。
    猜你喜欢
    • 2015-10-02
    • 1970-01-01
    • 1970-01-01
    • 2019-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-27
    相关资源
    最近更新 更多