记录日志信息

你可以通过 log_message() 方法将信息记录在本地日志文件中,并且必须在第一个参数中指定错误的”级别”,来表明这个信息的类型(debug,error等)。 第二个参数就是信息本身:

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

总共有八种不同的事件报错级别,与 RFC 5424 中所定义的错误级别一一对应,它们是:

* **debug** - 详细的debug信息。
* **info** - 你的应用中的一些有意义的事件,例如用户登录,记录SQL语句等。
* **notice** - 你的应用中的一些正常但明显有价值的事件。
* **warning** - 出现了异常,但不是错误,例如使用了被废弃的API,某个API的调用异常,或其他不期望出现的,但不是错误的情况。
* **error** - 运行时错误,不需要立即被处理但通常需要被记录或者监控。
* **critical** - 危险情况,例如某个程序组件不可用,或出现未被捕获的异常等。
* **alert** - 告警,必须采取行动来修复,例如整个网站宕机或数据库无法访问等。
* **emergency** - 系统不可用。

日志系统不提供警告系统管理员或网站管理者的方法,只是单纯的记录信息。对于诸多更为危险的错误级别,日志就会被异常调度器自动抛出,如上所述。

配置

你可以修改 /app/Config/Logger.php 配置文件来修改哪些级别的事件会被实际记录,以及为不同的事件等级分配不同的日志记录器等。

配置文件中的 threshold (报错阈值)决定了从哪个级别开始的事件将会在整个应用中记录下来。如果应用中有任何低于报错阈值的事件记录被记录时,这些请求将会被忽略。 最为简单的使用阈值的方法就是将其设为你希望记录的报错等级的最低值。举例来说,如果你想记录warning信息,而不是information信息,就需要将报错阈值设为 5 。所有报错等级低于5的日志记录请求 (包括运行时错误,系统错误等)将会被记录,而info, notice和debug级别的错误就会被忽略:

public $threshold = 5;

关于报错级别和对应的阈值的列表列举在配置文件中以供参阅。

你可以通过给报错阈值赋值一个包含报错等级数字的数组,来选择特定的报错级别:

// 只记录debug和info类型的报错
public $threshold = [5, 8];

使用多个日志调度器

日志系统支持同时使用多种调度器来处理日志记录。每一种调度器可以独立地设置用于特定的错误等级,并忽略其他的。现状而言,我们默认安装了两种调度器以供使用:

  • 文件调度器 是默认的调度器,它将会每天在本地创建一个独立的日志文件,同时这也是较为被推荐的日志记录方式。
  • ChromeLogger 调度器 如果你在Chrome浏览器上安装了 ChromeLogger 扩展 ,你可以使用这种调度器将日志输出到Chrome的控制台窗口中。

调度器配置于主配置文件中的 $handlers 属性中,这一属性的格式为一个包含一组调度器和它们对应的配置的数组。 每个调度器被定义数组的键,格式为完整命名空间格式的类名,而对应的值就是一个数组。 每个调度器配置块中都会有一个通用的属性: handle ,对应着该调度器将要记录的报错级别的 名字

public $handlers = [

        //--------------------------------------------------------------------
        // 文件调度器
        //--------------------------------------------------------------------

        'CodeIgniter\Log\Handlers\FileHandler' => [

                'handles' => ['critical', 'alert', 'emergency', 'debug', 'error', 'info', 'notice', 'warning'],
        ]
];

根据上下文修改记录信息

我们经常会根据上下文来修改记录信息的某些细节。比如说,可能会记录用户ID,IP地址,当前的POST变量等。 你可以通过在信息中使用通配符来实现。每个通配符必须被大括号({}) 包裹起来。在第三个参数中,你需要提供一个包含有通配符名,与其对应值的数组。 这些内容将会插入到记录信息字符串中:

// 生成一条例如这样的信息:用户123登录系统,登录IP为127.0.0.1
$info = [
        'id' => $user->id,
        'ip_address' => $this->request->ip_address()
];

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

如果你想记录一条异常或一个错误,你可以使用”exception”作为键,对应的值就是这条异常或错误本身。 这样一来这个异常或错误对象包含的错误信息,文件名和对应行号就会生成一条字符串。 你需要在记录信息中中提供exception通配符:

try
{
        ... 一些能抛出异常的代码
}
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 并符合 PSR3 规范。 这意味着你可以使用任何符合PSR-3规范的日志器,或者造一个自己的。

你需要将第三方日志器放入 /app/Config/Autoload.php 配置文件中或者通过某个自动加载器,比如Composer,来保证第三方日志器在系统中可被找到。 接下来你需要修改 /app/Config/Services.php ,将 logger 的别名设置为新的日志器的类名。

现在开始,对 log_message() 的所有调用都会使用你自定义的日志器进行日志记录。

LoggerAware Trait(代码复用)

当你需要将你的日志库以框架不感知的形式调用时,你可以使用实现了 setLogger 方法的 CodeIgniter\Log\LoggerAwareTrait 。 从而当在不同框架环境下使用日志库时,你的日志器依旧可如同预期一般运行,只要它能找到一个符合PSR3的日志器。