Slim研读笔记七乱入篇之Monolog(下)

Monolog将您的日志发送到文件,Socket,收件箱,数据库和各种Web服务。  特殊的处理程序允许您构建高级日志记录策略。

该库实现了可以在自己的库中提示的PSR-3接口,以保持最大的互操作性。 您也可以在您的应用程序中使用它,以确保您以后可以随时使用其他兼容的记录器。


核心概念

每个记录器实例都有一个通道(名称)和一系列处理程序。无论何时向记录器添加记录,它都会遍历处理器堆栈。每个处理程序决定它是否完全处理记录,如果是,则记录的传播在那里结束。
这允许灵活的日志记录设置,例如在堆栈的底部有一个StreamHandler,它可以将任何东西记录到磁盘上,最重要的是添加一个只有在记录错误信息时才发送邮件的MailHandler。处理程序还有一个$ bubble属性,它定义了是否阻止记录,如果他们处理它。在这个例子中,将MailHandler的$ bubble参数设置为false意味着由MailHandler处理的记录不会再传播到StreamHandler。
您可以创建许多记录器,每个记录器定义一个通道(例如:db,request,router,..),每个记录器组合不同的处理器,可以共享或不共享。频道反映在日志中,并允许您轻松查看或过滤记录。
每个处理程序也有一个格式化程序,一个默认的设置,如果你没有设置一个有意义的将被创建。格式化程序对输入记录进行归一化和格式化,以便处理程序可以使用它们输出有用的信息。

自定义严重性级别不可用。只有八个RFC 5424级别(调试,信息,通知,警告,错误,关键,警报,紧急)出现在基本的过滤目的中,但是对于需要灵活性的排序和其他用例,您应该将处理器添加到记录器可以在处理之前向记录添加额外的信息(tags, user ip, ..)。


定制日志格式

Monolog支持RFC 5424中描述的日志记录级别。
调试(100):详细的调试信息。
信息(200):有趣的事件。 示例:用户登录,SQL日志。
通知(250):正常但重要的事件。
警告(300):特殊事件不是错误。 示例:使用已弃用的API,糟糕的API使用,不期望的事情不一定是错误的。
错误(400):运行时错误,不需要立即采取行动,但通常应该被记录和监视。
关键(500):关键条件。 示例:应用程序组件不可用,意外异常。
警告(550):必须立即采取行动。 例如:整个网站关闭,数据库不可用等。这应该会触发SMS警报并唤醒您。

紧急(600):紧急:系统不可用。


配置记录器

这里是一个基本的设置,记录到一个文件和firephp,并使用DEBUG级别:

<?php

use Monolog\Logger;
use Monolog\Handler\StreamHandler;
use Monolog\Handler\FirePHPHandler;

// Create the logger
$logger = new Logger('my_logger');
// Now add some handlers
$logger->pushHandler(new StreamHandler(__DIR__.'/my_app.log', Logger::DEBUG));
$logger->pushHandler(new FirePHPHandler());

// You can now use your logger
$logger->info('My logger is now ready');

我们来解释一下。 第一步是创建将在您的代码中使用的记录器实例。 参数是一个通道名称,当您使用多个记录器时,该名称很有用(请参阅下面有关它的更多详细信息)。
记录器本身不知道如何处理记录。 它委托给一些处理程序。 上面的代码在堆栈中注册了两个处理程序,以允许以两种不同的方式处理记录。

请注意,FirePHPHandler首先被调用,因为它被添加到堆栈顶部。 这允许您临时添加一个禁用冒泡的记录器,如果您想覆盖其他配置的记录器。


在记录中添加额外的数据

Monolog提供了两种不同的方式来在简单的文本消息中添加额外的信息。

使用日志上下文

第一种方法是上下文,允许传递记录中的数据:
<?php

$logger->info('Adding a new user', array('username' => 'Seldaek'));
简单的处理程序(例如StreamHandler)将简单地将数组格式化为字符串,但更丰富的处理程序可以利用上下文(例如FirePHP能够以相当的方式显示数组)。

使用处理器

第二种方法是使用处理器为所有记录添加额外的数据。处理器可以是任何可调用的。他们将得到的记录作为参数,必须在最终改变额外的部分后返回。让我们编写一个处理器,在记录中添加一些虚拟数据:

<?php

$logger->pushProcessor(function ($record) {
    $record['extra']['dummy'] = 'Hello world!';

    return $record;
});

Monolog提供了一些可以在您的项目中使用的内置处理器。看看列表的专用章节。

提示:处理器也可以在特定的处理程序而不是记录器上注册,仅适用于此处理程序。


使用通道

通道是确定记录与哪个应用程序相关的一个很好的方法。这在大型应用程序中很有用(在Symfony2中由MonologBundle使用)。

图片两个记录器共享一个处理程序,写入单个日志文件。频道将允许您识别发布每条记录的记录器。您可以轻松地通过过滤这个或那个通道的日志文件。

<?php

use Monolog\Logger;
use Monolog\Handler\StreamHandler;
use Monolog\Handler\FirePHPHandler;

// Create some handlers
$stream = new StreamHandler(__DIR__.'/my_app.log', Logger::DEBUG);
$firephp = new FirePHPHandler();

// Create the main logger of the app
$logger = new Logger('my_logger');
$logger->pushHandler($stream);
$logger->pushHandler($firephp);

// Create a logger for the security-related stuff with a different channel
$securityLogger = new Logger('security');
$securityLogger->pushHandler($stream);
$securityLogger->pushHandler($firephp);

// Or clone the first one to only change the channel
$securityLogger = $logger->withName('security');

定制日志格式

在Monolog中,很容易定制写入文件,套接字,邮件,数据库和其他处理程序的日志格式。大多数处理程序使用

$record['formatted']

值自动放入日志设备。该值取决于格式化程序设置。您可以在预定义的格式器类中进行选择,也可以编写自己的格式器(例如,用于可读输出的多行文本文件)。

要配置预定义的格式化类,只需将其设置为处理程序的字段即可:

// the default date format is "Y-m-d H:i:s"
$dateFormat = "Y n j, g:i a";
// the default output format is "[%datetime%] %channel%.%level_name%: %message% %context% %extra%\n"
$output = "%datetime% > %level_name% > %message% %context% %extra%\n";
// finally, create a formatter
$formatter = new LineFormatter($output, $dateFormat);

// Create a handler
$stream = new StreamHandler(__DIR__.'/my_app.log', Logger::DEBUG);
$stream->setFormatter($formatter);
// bind it to a logger object
$securityLogger = new Logger('security');
$securityLogger->pushHandler($stream);

您也可以在多个处理程序之间重用相同的格式化程序,并在多个记录程序之间共享这些处理程序。







  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值