记录信息

日志级别

您可以使用 log_message() 方法将信息记录到本地日志文件中。您必须在第一个参数中提供错误的“级别”,指示它是哪种类型的消息(调试、错误等)。第二个参数是消息本身

<?php

if ($some_var === '') {
    log_message('error', 'Some variable did not contain a value.');
}

有八个不同的日志级别,与 RFC 5424 级别匹配,它们如下所示

级别

描述

调试

详细的调试信息。

信息

应用程序中的有趣事件,例如用户登录、记录 SQL 查询等。

注意

应用程序中的正常但重要的事件。

警告

非错误的异常情况,例如使用已弃用的 API、API 使用不当或其他不理想但并非错误的情况。

错误

不需要立即采取行动的运行时错误,但通常应记录和监控。

严重

严重情况,例如应用程序组件不可用或出现意外异常。

警报

必须立即采取行动,例如整个网站宕机、数据库不可用等。

紧急

系统不可用。

日志系统不提供向系统管理员或网站管理员发送有关这些事件的警报的方式,它们仅记录信息。对于许多更严重的事件级别,日志记录由上面描述的错误处理程序自动执行。

配置

您可以在 **app/Config/Logger.php** 配置文件中修改实际记录的级别,以及为不同级别分配不同的记录器。

配置文件的 threshold 值决定了整个应用程序中记录的级别。如果应用程序请求记录任何级别,但阈值目前不允许它们记录,则它们将被忽略。最简单的方法是将此值设置为要记录的最低级别。例如,如果您想记录警告消息,而不是信息消息,则将阈值设置为 5。任何级别为 5 或更低(包括运行时错误、系统错误等)的日志请求都将被记录,而信息、通知和调试将被忽略。

<?php

namespace Config;

use CodeIgniter\Config\BaseConfig;

class Logger extends BaseConfig
{
    public $threshold = 5;

    // ...
}

配置文件中提供了级别及其对应阈值的完整列表,供您参考。

您可以通过将日志级别数字数组分配给阈值来选择要记录的特定级别。

<?php

namespace Config;

use CodeIgniter\Config\BaseConfig;

class Logger extends BaseConfig
{
    // Log only debug and info type messages
    public $threshold = [5, 8];

    // ...
}

使用多个日志处理程序

日志系统可以支持同时运行多种日志处理方法。每个处理程序可以设置为处理特定级别并忽略其余级别。目前,默认安装附带三个处理程序。

  • **文件处理程序** 是默认处理程序,它将在本地为每天创建一个文件。这是推荐的日志记录方法。

  • **ChromeLogger 处理程序** 如果您在 Chrome 网络浏览器中安装了 ChromeLogger 扩展,您可以使用此处理程序在 Chrome 的控制台窗口中显示日志信息。

  • 错误日志处理程序 此处理程序将利用 PHP 的原生 error_log() 函数并将日志写入其中。目前,仅支持 error_log()04 消息类型。

处理程序在主配置文件中配置,位于 $handlers 属性中,它只是一个包含处理程序及其配置的数组。每个处理程序都用其完全限定的类名作为键来指定。值将是一个包含不同属性的数组,具体取决于每个处理程序。每个处理程序的部分将有一个共同的属性:handles,它是一个包含处理程序将记录信息的日志级别名称的数组。

<?php

namespace Config;

use CodeIgniter\Config\BaseConfig;

class Logger extends BaseConfig
{
    public $handlers = [
        // File Handler
        'CodeIgniter\Log\Handlers\FileHandler' => [
            'handles' => ['critical', 'alert', 'emergency', 'debug', 'error', 'info', 'notice', 'warning'],
        ],
    ];

    // ...
}

使用上下文修改消息

您通常希望根据正在记录的事件的上下文来修改消息的详细信息。您可能需要记录用户 ID、IP 地址、当前 POST 变量等。您可以通过在消息中使用占位符来实现。每个占位符必须用大括号括起来。在第三个参数中,您必须提供一个包含占位符名称(不带大括号)及其值的数组。这些值将被插入到消息字符串中

<?php

// Generates a message like: User 123 logged into the system from 127.0.0.1
$info = [
    'id'         => $user->id,
    'ip_address' => $this->request->getIPAddress(),
];

log_message('info', 'User {id} logged into the system from {ip_address}', $info);

如果您想记录异常或错误,可以使用“exception”键,其值为异常或错误本身。将从该对象生成一个字符串,其中包含错误消息、文件名和行号。您仍然必须在消息中提供异常占位符

<?php

try {
    // Something throws error here
} catch (\Exception $e) {
    log_message('error', '[ERROR] {exception}', ['exception' => $e]);
}

存在一些核心占位符,这些占位符将根据当前页面请求自动扩展

占位符

插入的值

{post_vars}

$_POST 变量

{get_vars}

$_GET 变量

{session_vars}

$_SESSION 变量

{env}

当前环境名称,例如,development

{file}

调用日志记录器的文件名称

{line}

在 {file} 中调用日志记录器的行号

{env:foo}

$_ENV 中“foo”的值

使用第三方日志记录器

您可以使用任何您喜欢的其他日志记录器,只要它扩展自 Psr\Log\LoggerInterface 并且与 PSR-3 兼容即可。这意味着您可以轻松地使用任何与 PSR-3 兼容的日志记录器,或者创建您自己的日志记录器。

您必须确保系统能够找到第三方日志记录器,方法是将其添加到 app/Config/Autoload.php 配置文件或通过其他自动加载器(如 Composer)添加。接下来,您应该修改 app/Config/Services.php 以将 logger 别名指向您的新类名。

现在,通过 log_message() 函数进行的任何调用都将使用您的库。