资讯专栏INFORMATION COLUMN

【翻译】Monolog使用说明

Eidesen / 3051人阅读

摘要:格式化器用来规范化并格式化输入的记录,以便处理器能输出一些有用的信息。只支持使用中定义的八个级别调试信息提示警告错误严重警报紧急来作为基本的筛选目的。警报必须立即采取行动。这个值依赖格式化器的配置。

前言

最近项目中使用的 Monolog 出了点小问题,去翻其文档,发现居然只有英文的。趁业余时间,翻译一下吧。
以下是其使用说明的中文翻译。更多翻译内容见 clarence-pan/monolog-zh-doc.

使用 Monolog

安装

核心概念

日志级别

配置一个日志服务

为记录添加额外的数据

使用通道

自定义日志格式

安装

Monolog 在 Packagist (monolog/monolog) 上可用,并且可以通过 Composer 安装:

composer require monolog/monolog

如果你不使用 Composer, 那你可以从 GitHub 上获取代码,然后使用任何兼容 PSR-0 的自动加载器(比如Symfony2 ClassLoader 组件)来加载 Monolog 的类

核心概念

每一个日志服务实例 (Logger) 都有一个通道(名称),并有一个处理器 (Handler)栈. 无论何时你添加一条 记录 到对应的日志服务实例,这个处理器栈将被遍历一遍:每个处理器都将依次决定是否要处理这条记录,而如果要处理,则遍历结束(译注:类似DOM事件冒泡)。

这样子可以创建非常灵活的日志配置。比如一个 StreamHandler 可以把所有日志都写入磁盘,而上面加个MailHandler 可以把错误日志作为邮件发送出去。处理器还有一个 $bubble 属性定义了是否屏蔽某条记录或者处理了某条记录。在这个示例中,配置 MailHandler$bubble 参数为 false 则意味着 MailHandler 将不会把自己已处理过的记录继续冒泡给 StreamHandler.

你可以创建许多日志服务实例(Logger),每一个则定义一个通道(比如数据库、请求、路由...)。而每一个日志服务实例都可以组合各种各样的处理器,可以共享处理器也可以不共享。这个通道将会在日志中反映出来,从而允许你可以很容易地查看或者筛选记录。

每一个处理还会有一个格式化器(Formatter)。如果你没有配置一个,则一个有意义的默认的格式化器将被创建。格式化器用来规范化并格式化输入的记录,以便处理器能输出一些有用的信息。

不支持自定义的严重性级别。只支持使用RFC 5424中定义的八个级别(调试/Debug、信息/Info、提示/Notice、警告/Warning、错误/Error、严重/Critical、警报/Alert、紧急/Emergency)来作为基本的筛选目的。不过,如果为了排序或者其他需要灵活性的使用场景,你可以添加加工程序(Processor)从而可以在(处理器)处理前添加额外的信息(标签、用户IP...)。

日志级别

Monolog 支持一下 RFC 5424 中的日志级别:

调试/DEBUG (100): 详细的调试信息。

信息/INFO (200): 有意义的事件,比如用户登录、SQL日志。

提示/NOTICE (250): 正常但是值得注意的事件。

警告/WARNING (300): 异常事件,但是并不是错误。比如使用了废弃了的API,错误地使用了一个API,以及其他不希望发生但是并非必要的错误。

错误/ERROR (400): 运行时的错误,不需要立即注意到,但是需要被专门记录并监控到。

严重/CRITICAL (500): 边界条件/危笃场景。比如应用组件不可用了,未预料到的异常。

警报/ALERT (550): 必须立即采取行动。比如整个网站都挂了,数据库不可用了等。这种情况应该发送短信警报,并把你叫醒。

紧急/EMERGENCY (600): 紧急请求:系统不可用了。

配置一个日志服务

这里有一个基本的配置,可以记录日志到文件,并在 DEBUG 级别下记录到 firephp 中:

pushHandler(new StreamHandler(__DIR__."/my_app.log", Logger::DEBUG));
$logger->pushHandler(new FirePHPHandler());

// 现在你就可以用日志服务了
$logger->info("My logger is now ready");

解释一下。第一步是创建日志服务实例,这个实例后将在代码中用到。唯一的参数是通道的名称,它在你有多个日志服务实例的时候很有用。(更多详情参见下面)

这个日志服务实例自己是不是知道如何处理一条日志记录的。它把记录代理给了一些处理器。上面的代码中注册了两个处理器到栈中,以便允许使用两种不同的方式来处理日志记录。

注意,FirePHPHandler 是被先调用的,因而它被添加到了栈顶。这允许你临时添加一个禁止冒泡的处理器从而允许你覆盖其他配置的日志(处理器)。

如果你多带带使用 Monolog, 并且在寻找一种简单的方式来配置许多处理器,那可以用
theorchard/monolog-cascade 。
它可以帮你使用PHP数组、YAML或者JSON来构建复杂的日志配置。

为记录添加额外的数据

Monolog 提供了两种不同的方式来为简单的文本消息增加额外的信息

使用上下文(context)

第一种方式是使用上下文(context),这允许你在传递记录的时候传递一个数组格式的数据:

info("Adding a new user", array("username" => "Seldaek"));

简单的处理器(比如StreamHandler)将只是把数组转换成字符串。而复杂的处理器则可以利用上下文的优点(如 FirePHP 则将以一种优美的方式显示数组)。

使用加工程序(Processor)

第二种方式是使用加工程序来为所有的记录添加额外数据。加工程序可以是任何可以调用的函数。
加工程序接收日志记录作为参数,并且需要在修改了extra字段后再返回日志记录。让我们来写一个添加一些假数据的加工程序:

pushProcessor(function ($record) {
    $record["extra"]["dummy"] = "Hello world!";

    return $record;
});

Monolog提供了一些内置的加工程序,你可以在你的项目中使用它们。请参见对应的章节.

小技巧:加工程序可以被注册到一个特定的处理器上而不是直接在日志服务实例上,从而可以只在对应的处理器上生效。

使用通道

通道是一种非常棒的方式来区分是应用的哪个部分的日志被记录下来的。这通常在大型项目中非常有用(而且被Symfony2的MonologBundle所使用)。

假设有两个日志服务实例共享了一个处理器,这个处理器将日志写入单个日志文件。通道则将允许你来区分是哪个日志服务实例记录了哪条日志。你可以很简单地通过通道来筛选日志。

pushHandler($stream);
$logger->pushHandler($firephp);

// 使用另外的通道来创建安全相关的日志服务示例
$securityLogger = new Logger("security");
$securityLogger->pushHandler($stream);
$securityLogger->pushHandler($firephp);

// 或者克隆第一个,只是改变下通道
$securityLogger = $logger->withName("security");
自定义日志格式

在Monolog中,可以很简单地来自定义日志的格式,无论是写入文件、套接字、邮件、数据库还是其他处理器。大多数处理器都是用 $record["formatted"] 这个值来自动写入日志设备。这个值依赖格式化器的配置。你可以选择预定义的格式化器类,也可以自己写一个(比如一个可读的多行文本文件)。

想要配置一个预定义的格式化器类,可以直接把它设置为处理器的字段:

// 默认的日期格式是 "Y-m-d H:i:s"
$dateFormat = "Y n j, g:i a";
// 默认的输出格式是 "[%datetime%] %channel%.%level_name%: %message% %context% %extra%
"
$output = "%datetime% > %level_name% > %message% %context% %extra%
";
// 最后创建一个格式化器
$formatter = new LineFormatter($output, $dateFormat);

// 创建一个处理器
$stream = new StreamHandler(__DIR__."/my_app.log", Logger::DEBUG);
$stream->setFormatter($formatter);

// 将其绑定到日志服务对象上
$securityLogger = new Logger("security");
$securityLogger->pushHandler($stream);

// 你还可以在多个处理器之间复用同一个格式化器,并且在多个日志服务实例间共享这些处理器。

处理器、格式化器和加工程序 →


说明:本文首发地址:https://www.clarencep.com/201...,转载请注明出处,如有翻译得不当之处欢迎指正。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/23173.html

相关文章

  • Composer进阶使用 —— 常用命令和版本约束

    摘要:建议使用折音号操作符。对于使用作为版本号标准的项目来说,这种版本约束方式很实用。折音号操作符的行为跟有比较大的关联,它允许升级版本到安全的版本。 这篇文章主要介绍一些常用的包管理命令以及包的版本如何进行约束。 常用命令 require命令 在《Composer快速入门》中已经简单介绍过使用install命令安装依赖的方式。除了install命令,我们还可以使用require命令快速的安...

    keelii 评论0 收藏0
  • laravel sentry

    摘要:注册登录登录创建选择安装扩展使用方法来自配置获取测试少写个分号查看效果发送到对象当方法调用时执行资源你也可以本地搭建之部署到生产环境搭建自己的服务基于安装自 注册登录 GitHub登录showImg(https://segmentfault.com/img/bVbgcrL?w=1109&h=554); 创建project 选择 laravelshowImg(https://segme...

    tinysun1234 评论0 收藏0
  • [PHP 类库] Monolog - Logging for PHP 5.3+

    摘要:当你添加一条记录时,记录会依次通过堆栈的处理。而每个也可以决定是否把记录传递到下一个堆栈里的下一个。同时我们把放在堆栈的最上面,通过设置日志等级把错误日志通过邮件发送出去。可以创建多个,每个都可以定义自己的频道名和堆栈。 Monolog是PHP的一个日志类库。相比于其他的日志类库,它有以下的特点: 功能强大。可以把日志发送到文件、socket、邮箱、数据库和各种web servic...

    Gilbertat 评论0 收藏0
  • Composer 简介

    摘要:默认情况下它不会在全局安装任何东西。这种想法并不新鲜,受到了和的强烈启发。其中一些库依赖于其他库。系统要求运行需要以上版本。一些敏感的设置和编译标志也是必须的,但对于任何不兼容项安装程序都会抛出警告。这是的二进制文件。 Composer 是 PHP 的一个依赖管理工具。它允许你申明项目所依赖的代码库,它会在你的项目中为你安装他们。 1. 依赖管理 Composer 不是一个包管理器...

    Code4App 评论0 收藏0
  • Laravel5.5 综合使用

    摘要:使用开发一个自动交割的项目,把使用到的开源扩展包及特性整理起来,以供后续使用。一安装提示工具是一个极其好用的代码提示及补全工具,可以给编写代码带来极大的便利。更多关于的任务调度,请看考该文的任务调度计划任务功能 使用 Laravel5.5 开发一个自动交割的项目,把使用到的开源扩展包及特性整理起来,以供后续使用。 一、安装IDE提示工具 Laravel IDE Helper 是一个极其...

    banana_pi 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<