记录信息

日志级别

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

<?php

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

有八种不同的日志级别,与 RFC 5424 级别匹配,如下所示:

级别

描述

debug

详细的调试信息。

info

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

notice

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

warning

非错误的异常事件,如使用废弃的 API、错误使用 API 或其他不一定错误的不可取之处。

error

不需要立即处理但通常应记录和监控的运行时错误。

critical

关键状态,如应用程序组件不可用,或意外异常。

alert

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

emergency

系统无法使用。

日志系统不提供通知系统管理员或网站管理员这些事件的方法,它仅记录信息。对于许多更关键的事件级别,日志由上述错误处理程序自动完成。

配置

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

配置文件中的 threshold 值确定跨应用程序记录的级别。如果应用程序请求记录任何级别,但阈值当前不允许它们记录,则它们将被忽略。使用的最简单方法是将此值设置为你希望记录的最低级别。例如,如果你想记录警告消息而不是信息消息,你应该将阈值设置为 5。级别为 5 或更低(包括运行时错误、系统错误等)的任何日志请求都会被记录,而 info、notice 和 debug 会被忽略:

<?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];

    // ...
}

使用多个日志处理程序

日志系统可以同时支持运行多个日志处理方法。每个处理程序可以设置为处理特定级别并忽略其余级别。默认安装中提供了三个处理程序:

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

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

  • Errorlog Handler 此处理程序将利用 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}

调用 logger 的文件名

{line}

{file} 中调用 logger 的行

{env:foo}

$_ENV 中的 ‘foo’ 值

使用第三方日志器

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

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

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