Monolog[实战系列]

简述

Monolog 可以把日志保存到文件,socket,邮件,数据库,消息队列以及各种网络服务

要求

Monolog ^3.0 适用于 PHP 8.1 或更高版本。
Monolog ^2.5 适用于 PHP 7.2 或更高版本。
Monolog ^1.25 适用于 PHP 5.3 到 8.1,但不再得到很好的维护,并且不会再收到 PHP 支持修复。

日志等级

  • DEBUG : 记录调试信息
  • INFO : 记录一些有意思的事件,比如记录登录日志,SQL日志
  • NOTICE : 记录正常但重要的事件
  • WARNING : 记录不是错误的异常事件。比如使用已弃用的 API、API 使用不当等行为
  • ERROR : 记录不需要立即采取行动但通常应记录和监视的运行时错误
  • CRITICAL : 记录一些严重的事件,比如应用组件不可用,意想不到的异常
  • ALERT : 记录一些必须立即采取行动的事件,比如:整个网站宕机、数据库不可用等。可以设置成短信/电话通知提醒
  • EMERGENCY : 记录系统不可用

安装

$ composer require monolog/monolog

封装使用(可以直接使用)

<?php

namespace Common;

use Monolog\Handler\RotatingFileHandler;
use Monolog\Handler\SlackWebhookHandler;
use Monolog\Logger;
use Monolog\Processor\IntrospectionProcessor;
use Monolog\Processor\MemoryPeakUsageProcessor;
use Monolog\Processor\MemoryUsageProcessor;
use Monolog\Processor\WebProcessor;
use Psr\Log\LoggerInterface;

class Monolog
{
    /**
     * @var LoggerInterface
     */
    private static $logger;

    /**
     * 业务名称
     * @var string
     */
    private const NAME = 'backend';

    /**
     * 文件日志路径
     * @var string
     */
    private const PATH = '/data/logs/monolog/';

    /**
     * Slack webhook 地址
     * @var string
     */
    private const SLACKWEBHOOK = 'https://hooks.slack.com/services/xxxxxxxx';

    public static function __callStatic($name, $arguments)
    {
        $message = empty($arguments[0]) ? '' : $arguments[0];
        $context = empty($arguments[1]) ? [] : $arguments[1];
        return self::getLogger()->$name($message, $context);
    }

    public static function getLogger($name = self::NAME, $path = self::PATH)
    {
        if (self::$logger === null) {
            self::$logger = new Logger($name);

            // extra保存从$_SERVER获取请求链接,用户IP,请求方法,服务器地址,referer
            $web = new WebProcessor();
            self::$logger->pushProcessor($web);
            // extra保存调用日志的文件和行号,这里只针对WARNING以上级别的日志
            $Introspection = new IntrospectionProcessor(Logger::WARNING, [], 1);
            self::$logger->pushProcessor($Introspection);
            // extra保存当前内存使用量
            $memoryUsage = new MemoryUsageProcessor();
            self::$logger->pushProcessor($memoryUsage);
            // extra保存内存使用峰值
            $memoryPeakUsage = new MemoryPeakUsageProcessor();
            self::$logger->pushProcessor($memoryPeakUsage);

            // 使用RotatingFileHandler 每天生成一个日志
            // 格式:backend-2023-05-10.log  backend-2023-05-11.log 
            $fileHandler = new RotatingFileHandler($path . $name . ".log", 0, Logger::DEBUG, true, 0644);
            self::$logger->pushHandler($fileHandler);

            // 使用SlackWebhookHandler 发送 CRITICAL 级别以上的日志
            $slackWebhookHandler = new SlackWebhookHandler(self::SLACKWEBHOOK, 'channel', self::NAME);
            $slackWebhookHandler->setLevel(Logger::CRITICAL);
            self::$logger->pushHandler($slackWebhookHandler);
        }

        return self::$logger;
    }
}
// 使用方式
Monolog::info('日志内容', ['KEY'=>'数组形式上下文信息']);
Monolog::alert("亿总不好拉");
//输出日志
[2023-05-11T03:34:24.414064+00:00] backend.INFO: 日志内容 {"KEY":"数组形式上下文信息"} {"memory_peak_usage":"2 MB","memory_usage":"2 MB"}
[2023-05-11T03:11:44.603741+00:00] backend.ALERT: 亿总不好拉 [] {"memory_peak_usage":"2 MB","memory_usage":"2 MB","file":"/home/sonj/workspace/monolog/src/monolog.php","line":9,"class":null,"callType":null,"function":null,"url":"/monolog.php","ip":"192.168.6.25","http_method":"GET","server":"192.168.6.33","referrer":null}

Handler

monolog内置了相当多的日志处理器

文件,系统日志
  • StreamHandler : 将日志存储到所有PHP流中,包括文件
  • RotatingFileHandler : 将日志存储到每天新建一个日志文件中,可以限制日志文件的总数
  • SyslogHandler : 将日志存储到操作系统日志中,底层调用syslog函数,默认在/var/log/syslog,可以在php.ini配置syslog相关参数
  • ErrorLogHandler : 将日志存储到错误日志中,底层调用error_log函数,php.ini可以配置错误日志路径
  • ProcessHandler : 存储到任何进程的标准输入 STDIN ,可以指定命令。
警报,邮件
  • NativeMailerHandler : 将日志发送到邮件,底层调用内置函数mail,不推荐使用内置mail函数,所以不推荐使用这个handler
  • SymfonyMailerHandler : 将日志发送到邮件,底层调用symfony的mail组件
  • PushoverHandler : Pushover 让您可以轻松地在 Android、iPhone、iPad 和台式机(Android Wear 和 Apple Watch!)上获取实时通知!,看了一下是个国外的推送平台,没用过
  • SlackWebhookHandler : slack是一个类似微信的聊天工具,使用slack webhook方式把日志发送到群里
  • SlackHandler : 使用slack api方式,把日志发送到
  • SendGridHandler : 将日志发送到邮件,sendgrid是国外一个提供可靠邮件服务的平台
  • MandrillHandler: 也是一个发邮件的平台
  • FleepHookHandler : fleep跟slack一样是个即时聊天工具
  • TelegramBotHandler : 应该是打电话通知
第三方日志平台,服务器进程
  • SocketHandler : 把日志传输给socket文件,unix socket 或者 tcp socket,相当于传给一个进程
  • AmqpHandler : 把日志传输给实现了AMQP协议的服务器,一般指的是消息队列
  • GelfHandler : 第三方付费日志平台 Graylog2
  • ZendMonitorHandler : 传给zend监视器,底层调用zend_monitor_custom_event
  • NewRelicHandler : 第三方付费日志平台 NewRelic
  • LogglyHandler : 第三方付费日志平台 Loggly
  • RollbarHandler:第三方付费日志平台 Rollbar
  • SyslogUdpHandler: 第三方付费日志平台 Syslogd
  • LogEntriesHandler :第三方付费日志平台 LogEntries
  • InsightOpsHandler : 第三方付费日志平台 InsightOps
  • LogmaticHandler : 第三方付费日志平台 Logmatic
  • SqsHandler : 亚马逊简单队列服务 AWS SQS
开发日志
  • FirePHPHandler: FirePHP 是一个浏览器扩展,日志将输出到FirePHP console
  • ChromePHPHandler: 谷歌浏览器扩展
  • BrowserConsoleHandler : 打印到js console,大部分浏览器都支持
数据库
  • RedisHandler: 使用 redis 队列存储日志
  • RedisPubSubHandler: 使用 redis 发布/订阅功能发布日志
  • MongoDBHandler : 使用 mongodb 存储日志
  • CouchDBHandler : 使用 CouchDB 存储日志
  • DoctrineCouchDBHandler:使用 CouchDB 存储日志
  • ElasticaHandler:使用 es 存储日志,底层使用ruflin/elastica组件
  • ElasticsearchHandler:使用 es 存储日志
  • DynamoDbHandler: 使用亚马逊的 DynamoDB 存储日志
  • PdoHandler : 这个没有,可以自己实现
封装handler,特殊的handler
  • FingersCrossedHandler : 它以一个 handler 作为参数,缓冲所有日志,直到达到某个日志级别(比如 ALERT )时,才把日志传给这个 handler
  • DeduplicationHandler:它以一个 handler 作为参数,会累积所有层级的日志记录,直到请求结束(或 flush()被调用)才将所有记录传递给 handler ,在给定时间段内(默认为 60 秒)会去重。这个的主要用途是在严重故障的情况下,所有请求都将失败并且可能导致产生大量重复日志。
  • GroupHandler: 将多个 handler 组合成一组,并将日志同时发送到这组处理器。并且可以为不同处理器设置不同日志级别
  • WhatFailureGroupHandler: 这个 handler 是grouphandler的优化版,忽略了某个子 handler 发生异常导致其他 handler 没法正常记录日志
  • FallbackGroupHandler: 这个 handler 是 grouphandler 的优化版,按顺序尝试使用子 handler 处理日志,如果前一个失败则下一个,如果成功则停止,剩下的 handler 就不记录了
  • BufferHandler:缓冲所有日志,直到调用close时才发送到 handler
  • FilterHandler: 用于过滤日志,只将匹配过滤规则的日志发送到子 handler, 可以根据日志级别、通道名称、消息内容等进行过滤
  • SamplingHandler: 用于对日志进行采样,只将一定比例的日志发送到子处理器。可以设置采样的频率,如只发送 50% 的日志。主要用于在大量日志的情况下,减少发送到某个处理器的日志量。
  • NoopHandler:它不会对日志进行任何处理,只是丢弃接收到的所有日志。
  • NullHandler: 一个输出日志级别的空 handler ,它会在日志记录时输出当前日志的级别名称。 主要用于在未设置 handler 时,避免 Monolog 抛出异常。
  • PsrHandler: 将日志记录翻译为 PSR-3 日志记录,并转发给任意的 PSR-3 日志实例。允许 Monolog 处理器链和第三方的 PSR-3 日志系统集成。
  • TestHandler: 一个用于测试的 handler ,它会将接收到的所有日志记录在数组中保存。
  • HandlerWrapper:是一个 handler 包装器,用于包装其他 handler 并对其行为进行修改。
  • OverflowHandler: 用于在子 handler 队列溢出时丢弃部分日志,从而避免其他日志丢失,提高日志系统的健壮性。

日志格式

  • LineFormatter : 标准行格式
    [2023-05-08T15:44:36.377106+08:00] my_logger.WARNING: My logger is now ready [] {"dummy":"Hello world!"}
  • HtmlFormatter : 将日志格式化为HTML表格形式,适用于浏览器查看日志
  • NormalizerFormatter : 移除非字母数字字符,转换为小写,如:”foo bar baz” -> “foo bar baz”
  • ScalarFormatter : 将所有字段转换为标量(非资源类型)
  • JsonFormatter : 将日志格式化为JSON字符串
  • WildfireFormatter : Google Wildfire格式
  • ChromePHPFormatter : ChromeLogger格式,方便和Chrome PHP调试器一起使用
  • GelfMessageFormatter : Graylog Extended Log Format (GELF),用于Graylog日志收集和分析
  • LogstashFormatter : Logstash格式,用于和Logstash日志收集系统一起使用
  • ElasticaFormatter : Elasticsearch格式,用于直接发送日志到Elasticsearch
  • ElasticsearchFormatter : Elasticsearch格式,用于直接发送日志到Elasticsearch
  • LogglyFormatter : Loggly格式,用于和Loggly日志管理平台一起使用
  • MongoDBFormatter : MongoDB格式,用于直接将日志存入MongoDB
  • LogmaticFormatter : Logmatic.io格式,用于和logmatic.io日志管理平台一起使用
  • FluentdFormatter : Fluentd格式,用于和Fluentd日志收集系统一起使用
  • GoogleCloudLoggingFormatter : Google云端Logging格式,用于直接发送日志到Google云端Logging
  • SyslogFormatter : Syslog格式,用于发送日志到Syslog服务器

Processors handler 修改器

  • PsrLogMessageProcessor:用于提取 PSR-3 兼容日志记录的消息,并将其存储在 $record[‘message’] 中
  • ClosureContextProcessor:允许使用闭包设置任意上下文数据,相比 TagProcessor 更加灵活,可以设置任意键值对作为上下文数据
  • IntrospectionProcessor:添加有关日志记录来源的调试信息,包括调用函数、类和文件,用于调试目的,方便定位日志记录来源
  • WebProcessor: 从 $_SERVER 数组中提取 REMOTE_ADDR 和 REQUEST_URI ,并添加到日志记录中,用于 web 环境,添加客户端 IP 和当前页面 URI 到日志中
  • MemoryUsageProcessor:添加当前内存使用量 (bytes) 到日志记录中
  • MemoryPeakUsageProcessor:添加内存峰值 (bytes) 到日志记录中
  • ProcessIdProcessor:添加当前进程 ID 到日志记录中
  • UidProcessor:添加当前用户 ID 到日志记录中
  • GitProcessor:添加 Git版本库信息(提交版本、分支)到日志记录中
  • MercurialProcessor: 添加 Hg 版本库信息(提交版本、分支)到日志记录中
  • TagProcessor:允许添加自定义标签(标签)到日志记录中,以键值对的形式
  • HostnameProcessor:添加当前主机名到日志记录中
本作品采用《CC 协议》,转载必须注明作者和本文链接
遇强则强,太强另说
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!