大家好,我是编程小6,很高兴遇见你,有问题可以及时留言哦。
无论你使用什么语言和框架, 适当的日志记录对Web开发是至关重要的.在 调试和 性能监控方面,日志是关键 。知道如何正确使用日志框架是创建易于调试的高质量软件的一个重要部分。
在这篇文章中,我们将深入讨论Laravel,它是 2021年最流行的PHP框架 。
图1: 谷歌趋势比较流行的PHP框架
具体来说, 我们将涵盖以下关于Laravel 8.0的内容:
前四个部分涵盖了Laravel日志的基础知识.最后一节将你从这些部分学到的所有知识,并将其用于展示如何将你的日志语句发送到一个外部服务 - Netreo Retrace.
让我们开始吧!
提示。使用Stackify Retrace即时查找应用程序的错误和性能问题
通过集成的错误、日志和代码级别的性能洞察力,故障排除和优化你的代码很容易。
Monolog 是一个非常流行的PHP日志库,Laravel使用它来满足所有的日志需求。Monolog的奇妙之处在于,它提供了一个通用的接口,让你可以将日志写到任何地方,从标准的文本文件到第三方的日志管理服务。
关于单独使用Monolog的细节,你可以查看 这个教程。
Monolog非常灵活,可以将日志发送到文件、套接字、电子邮件地址、数据库和各种网络服务。在后面的章节中, 我们将展示Monolog如何提供处理程序,轻松帮助你将日志发送到这些不同的目的地。Laravel通常通过一个日志配置文件来设置Monolog, 所以现在我们要告诉你日志配置文件是如何工作的.
在Laravel中, 有各种各样的配置文件在 config 文件夹 中找到 , 其中包含了你的配置文件, 意味着数据库连接, 电子邮件连接, 缓存, 等等.你应该期望你的日志配置也能在这里找到,路径在 config/logging.php。
图2: config/logging.php的前五行
当你创建一个Laravel应用时, 前几行是它使用的进口。默认情况下, 你应该看到上面显示的两个处理程序被导入。正如前面所解释的, 这是Monolog提供的两个典型的处理程序.
Laravel Monolog使用了一个叫做通道的概念。这些通道是你可以发送你的日志的不同地方。对于config/logging.php的其余部分, 配置文件会返回一个有两个主要键的关联数组 - default 和 channels.
图3:默认通道通常是堆栈
Default代表任何日志被发送到的默认通道。最关键的是,你选择的默认通道要在数组中 的channel 键下表示 。 正如你在上面看到的,stack是默认通道。
图 4: 通道的列表
通道代表了可用于发送你的日志的全部通道列表,而stack是列出的第一个通道。在本文的其余部分,只要提到通道列表,我们就特指通道的完整列表。
在 通道列表下的每个通道中 ,你可以看到正在使用的不同键。了解每个键是如何影响日志记录的,将给你最大的灵活性来配置你想要的日志输出。
第一种类型的键是 驱动。在Laravel 5.6之前, Laravel的驱动程序只支持四个基于文件的输出:
在Laravel 5.6及以上版本中, 我们有全新的驱动程序支持更多的日志输出.旧的驱动仍然可以在 "single", "daily", "errorlog "和 "syslog "这些值下使用.现在我们有了新的数值,用于新种类的日志输出。一些常用的新驱动程序包括。
这只是意味着你可以将多个日志通道堆叠在一起。当你使用 "堆栈 "驱动时,你需要在 "通道 "这个键下为其他通道设置一个数值数组。请看图4,这是一个使用中的堆栈驱动程序的例子。
这可以让你把日志发送到流行的社交频道 Slack。当你使用这个驱动时,你也需要配置URL。可选的与Slack相关的变量包括用户名和表情符号。Slack驱动本质上允许你将日志输出到一个特定的Slack频道。默认情况下, 当你使用Laravel命令行创建一个8.0的新项目时, 你会看到一个配置Slack日志通道的例子(见下面的图5).
图 5: 默认情况下, Laravel 8.0包括一个Slack频道的例子
看到Monolog又出现了,这次是作为它自己的驱动,有点奇怪。要记住的一点是,当你想使用Monolog的本地处理程序时,你要使用Monolog驱动。值得庆幸的是,默认的日志配置文件提供了两个使用两种不同Monolog处理程序的例子。这里有一个指向 Monolog处理程序完整列表的链接 ,而不是对各种Monolog处理程序类型进行过多的详细介绍, 这样你就可以按照自己的速度来回顾。
图 6: 默认日志配置文件使用Monolog StreamHandler和SyslogHandler
在Laravel的官方文档中,只有一小段关于这个的文字。在流行的传统驱动程序和各种Monolog处理程序之间, 很难想象有人会编写自己的自定义通道驱动程序.然而, 如果你想这样做, 你可以.通常情况下,自定义通道是将日志写入第三方服务,如Apache Kafka和Logstash。
首先,你的自定义通道需要选择一个自定义驱动,然后添加一个 via 选项,指向一个日志工厂类。
'channels' => [
'custom' => [
'driver' => 'custom',
'via' => AppLoggingCustomLoggerFactory::class, ], ],
在你设置了自定义通道之后,你就可以准备定义工厂类了。请 记住,你必须通过 __invoke 方法返回一个 Monolog 记录仪实例 。
<?php
namespace AppLogging;
use MonologLogger;
class CustomLoggerFactory {
/** * This class will create a custom Monolog instance. * * @param array $config * @return MonologLogger */
public function __invoke(array $config) {
return new Logger(...);
}
}
尝试使用自定义驱动作为最后的手段。如果你稍微搜索一下,通常你会找到一个标准化的方法来使用现有的驱动或处理程序来满足你的特殊日志需求。即使你不得不自己编写自定义的日志驱动,也要尝试看看是否有人已经编写了开源版本或你需要的日志工厂类的例子。换句话说:如果你可以的话,不要重新发明轮子!
这里有一个有用的汇总表,列出了各种常见的驱动程序以及它们的含义。
驱动程序 | 描述 |
堆栈 | 用于创建 "多通道 "通道。 |
单一的 | 用于单文件或基于路径的记录仪通道。使用Monolog的StreamHandler。 |
每日 | 用于每天的日志。使用 Monolog 的 RotatingFileHandler。 |
slack | 用于发送至 Slack 频道。使用 Monolog 的 SlackWebhookHandler。 |
syslog | 用于向系统日志发送。使用 Monolog 的 SyslogHandler。 |
错误日志 | 用于发送至网络服务器的错误日志。使用 Monolog 的 ErrorLogHandler。 |
monolog | 用于使用Monolog支持的任何其他处理程序。 |
自定义 | 一个调用指定工厂的驱动,为第三方服务创建一个通道。 |
在通道和驱动之后,你需要学习的下一件重要事情是处理程序的概念。 Monolog有一个 完整的 处理程序列表, 用于发送日志。你甚至可以使用特殊的处理程序,这样你就可以建立更高级的日志策略。这里有一个Monolog处理程序的列表,分为以下几种类型。
另外,请注意,有一个特殊的选项叫做 handler_with ,它允许你为各个处理程序的构造方法赋值。
例如,当你看 SysLogHandler 类和 它的构造函数时,你会注意到这个。
public function __construct(string $ident, $facility = LOG_USER, $level = Logger::DEBUG, bool $bubble = true, int $logopts = LOG_PID)
在各个通道的配置中,你可以这样为构造器的参数赋值。
'syslog_channel_name' => [
'driver' => 'monolog',
'handler' => MonologHandlerSyslogHandler::class,
'handler_with' => [
'ident' => 'some value you want to assign to the ident parameter',
],
],
如果你已经走到了这一步,恭喜你!你现在已经深入到了细节中。你现在已经深入了解了Laravel日志的配置文件的细节。大多数开发人员对此只有粗略的了解,并没有让这阻止他们编写日志信息。因此, 在为你的团队配置Laravel日志时, 你现在比大多数开发者更有能力.
一个关键的配置细节是 水平。这一方面是因为上一节已经够长了, 但主要是因为在这里介绍级别更有意义.
在你想写日志信息的具体文件中,确保在写出日志信息之前导入Log facade,像这样。
use IlluminateSupportFacadesLog;
//.. and then somewhere in your php file
Log::emergency($message);
Log::alert($message);
Log::critical($message);
Log::error($message);
Log::warning($message);
Log::notice($message);
Log::info($message);
Log::debug($message);
通常情况下,当涉及到日志信息时,开发人员希望有不同的严重程度。这里所说的不同的日志级别对应于 RFC-5424规范。所以这些级别和它们的名字不是随意决定的,有一个优先级的顺序,最高的是 紧急 ,最低的是 调试。在通道列表中,你可以指定 单个通道记录任何消息的最低 级别。
级别并不是决定Laravel最终是否会写一个特定的消息到通道的唯一因素。通道作为一个目标也是另一个因素。请 记住,当你使用Log facade来写日志信息时,Laravel会把这些信息发送到 你的 config/logging.php 中的 默认通道。
如果你不改变日志配置文件, 并假设你没有将LOG_CHANNEL环境变量设置为不同的值, 你的默认通道将是堆栈的 "多通道", 这又包括了 "每日 "通道.
这就引出了一个问题:如果你想把一个特定的消息发送到默认通道以外的通道怎么办?你可以通过这种方式特意在飞行中选择一个替代通道。
Log::channel('suspicious')->warning($suspiciousActivity);
记住,要确保你选择的替代通道存在于日志配置文件的通道列表中。否则,你会遇到错误。在上面的例子中,这意味着你需要在通道列表中明确声明一个名为 可疑的通道 。
而如果你想向多个渠道发送相同的日志信息,你也可以执行 "堆叠"。
Log::stack(['suspicious', 'slack'])->info("I have a bad feeling about this!");
有时你想发送上下文信息,如具体的文件名、文件中的行,甚至是当前登录的用户。
你可以这样编写你的个别日志信息,以增加上下文信息。
Log::info('User login failed.', ['id' => $user->id, 'file' => __FILE__, 'line' => __LINE__]);
这个命令将传入一个数组的上下文数据给日志方法.然后Laravel将格式化上下文数据并与日志信息一起显示.
这个关于格式化的部分可以放在 "解释日志配置文件 "下的驱动和处理程序部分旁边.在这里,我们让 "格式化日志信息 "成为独立的部分,放在其他内容之后,因为它往往不是那么关键。
格式化不那么重要的主要原因是,你可以使用Monolog驱动使用的默认格式化器--Monolog LineFormatter。这通常是足够好的。然而,有时你可能希望定制传递给处理程序的格式。这是一个 Monolog原生提供的格式化器的完整列表 。值得注意的是,Monolog将这个列表按照最高的使用频率排列,所以如果你想选择替代方案,这是一个很好的参考列表。
当你想自定义格式化时,你需要 在特定的通道配置下 设置 格式化 选项。你还会注意到 formatter_with 选项,它的工作方式与 "处理程序 "一节中解释的 handler_with 选项 相似 。 handler_with 选项是一种向格式化器类构造方法发送值的方法。下面是一个例子,我们使用第二种最流行的格式化器,HtmlFormatter。
'browser_console' => [
'driver' => 'monolog',
'handler' => MonologHandlerBrowserConsoleHandler::class,
'formatter' => MonologFormatterHtmlFormatter::class,
'formatter_with' => [
'dateFormat' => 'Y-m-d',
],
],
>
有时一个特定的 Monolog 处理程序会有它自己的格式化器。在这种情况下,你可以简单地指示格式化器使用该处理器的默认格式。
如果你使用的 Monolog 处理程序能够提供它自己的格式器,你可以把格式器配置选项的值设为默认。
'newrelic' => [
'driver' => 'monolog',
'handler' => MonologHandlerNewRelicHandler::class, 'formatter' => 'default', ],
这里是压轴戏,你可以把你在前几节学到的东西都用在一个练习中。在这一节中, 我们尝试将Laravel的日志信息发送到Netreo Retrace.Retrace允许你从你的日志中收集洞察力, 给你一个单一的地方来执行 代码剖析, 性能监控 和 集中的日志.
正如你在 "解释日志配置文件 "一节中所学到的,将应用程序的日志信息发送到Retrace的第一步是为Retrace在堆栈多通道中添加一个特定的日志通道。
用 **composer require stackify/monolog "~2.X"**安装最新版本 。
或者你可以在你的 composer.json 文件中添加一个依赖项 。
"stackify/monolog": "~2.X",
关键变量是API密钥、应用程序名称和环境名称。确保它们被设置在你的Laravel应用的.env文件中。你应该为每个不同的.env文件设置不同的值,这取决于你希望从哪个环境发送日志。
我们建议在5个不同的地方修改配置文件, 我们用步骤3.1, 步骤3.2等符号将其分解成注释.
// after the typical imports in the config file
// Step 3.1 import the following and make sure you add
use StackifyLogTransportExecTransport;
use StackifyLogMonologHandler as StackifyHandler;
// Step 3.2: assign your Retrace various variables as environment variable then call here
$retrace_api_key = env('RETRACE_API_KEY', 'api_key');
// Step 3.3: create the transport instance here. You need this in Step 3.5
$transport_for_retrace = new ExecTransport($retrace_api_key);
return [
// for brevity I removed the comments
'default' => env('LOG_CHANNEL', 'stack'),
'channels' => [
'stack' => [
'driver' => 'stack',
// Step 3.4 add retrace channel to stack
'channels' => ['daily', 'retrace'],
],
// Step 3.5 setting up the retrace channel
'retrace' => [
'driver' => 'monolog',
'level' => 'debug',
'handler' => StackifyHandler::class,
// for clarity on the exact configuration look at the constructor method at
// https://github.com/stackify/stackify-log-monolog/blob/master/src/Stackify/Log/Monolog/Handler.php#L20
'handler_with' => [
'appName' => env('RETRACE_APP_NAME', 'app_name'),
'environmentName' => env('RETRACE_ENV_NAME', 'env_name'),
'transport' => $transport_for_retrace, // set in Step 3.3
]
],
// the rest of the channel list such as daily, syslog, etc are below
从上面的代码来看,步骤3.1到3.4是不言自明的。最复杂的将是步骤3.5,在这里我们创建一个全新的 回溯 通道。因为Retrace有一个与Monolog兼容的处理程序,我们建议使用Monolog驱动并在 处理程序 选项 下使用Retrace Monolog处理程序类 。另外,为 handler_with 选项 选择的可能的键 遵循给handler的 构造方法的 相同参数名称 。
呜呼!这是一个相当全面的Laravel日志的研究。回顾一下, 我们已经讨论了什么是Monolog,以及为什么Laravel要使用它来做日志记录。我们还探讨了Monolog的一些错综复杂的概念, 包括通道, 驱动, 和处理程序.此外, 我们还广泛地介绍了日志信息的编写和格式化.我们举例说明了如何写到默认通道或其他通道,最后,把所有这些概念结合起来,教你如何写一个通道, 把你的日志发送到Retrace。
你对使用Retrace进行Laravel日志记录感兴趣吗?抓住 免费的14天的试用期 与Stackify Retrace 免费试用14天!
这篇文章的作者是KimSia。KimSia以T.J. Simmons的名字写作。他在五年前开始了自己的开发公司,为那些被太多Excel电子表格压得喘不过气来的电信和金融业专业人士建立解决方案。他现在精通文件生成和从不同来源提取数据的自动化。