如何在 Laravel 中将消息记录到自定义文件中

默认情况下,Laravel 将所有日志消息聚合到一个文件中,该文件位于相对于项目根目录的 storage/logs/laravel.log 中。在本教程中,我们将介绍如何在 Laravel 中基于不同的配置(例如,不同的消息级别)创建自定义日志文件。

本教程使用 Laravel 8 和 PHP 7.3。

Laravel 安装

安装composer

首先,如果您的系统上没有 Composer,请下载它。

然后,运行以下命令来创建 Laravel 项目

composer create-project laravel/laravel custom-logs

此命令将下载Laravel及其所有依赖项,并将.env.sample复制到.env。

现在将目录更改为项目并启动服务器:

cd custom-logs
php artisan serve

果您转到Localhost:8000(或Laravel在运行上述命令后使用的任何端口),您会发现Laravel正在工作。

了解Laravel的日志

Laravel有不同的记录渠道。渠道是记录消息的不同方法。例如,Slack渠道将将消息记录到Slack,而单个通道只将所有消息放入一个文件中(默认情况下,在存储/日志/Laravel.log上)。 Laravel使用独白库处理日志。

Laravel日志的配置可在config/logging.php中找到。在那里,您会找到默认频道:

    'default' => env('LOG_CHANNEL', 'stack'),

默认情况下,Laravel使用堆栈通道,该通道允许您一次使用许多通道。我们将在本教程中以稍后的工作方式进入它的工作方式。

您还会找到一个具有相似结构的频道数组:

'single' => [
    'driver' => 'single',
    'path' => storage_path('logs/laravel.log'),
    'level' => env('LOG_LEVEL', 'debug'),
],

如何记录消息

在您的网站上,您可以使用Log facade来记录不同级别的日志消息:

use Illuminate\Support\Facades\Log;

Log::emergency($message);
Log::alert($message);
Log::critical($message);
Log::error($message);
Log::warning($message);
Log::notice($message);
Log::info($message);
Log::debug($message);

Log facade 将使用您在config/logging.php中选择的默认频道。因此,您只需要在此处进行配置更改,而无需每次记录消息。

基于级别的多个文件

在本节中,我们将了解如何根据消息的级别创建不同的文件。我们会将所有级别为“error”或更高级别的消息记录到 storage/logs/errors.log 中,所有级别低于该级别的消息都记录到 storage/logs/debug.log 中。这样,在我们的 Laravel 项目中跟踪错误并将它们与可能不那么重要的调试消息分开会更容易。

首先,在 config/logging.php 中的 channels 数组中添加一个新的通道 custom_errors,配置如下:

'custom_error' => [
    'driver' => 'single',
    'level'  => 'error',
    'path'   => storage_path('logs/errors.log'),
    'bubble' => false
]

此通道使用单个驱动程序,这意味着它将聚合所有消息到一个文件中。该文件将是通道路径配置中定义的 storage/logs/errors.log。我们已将级别设置为错误,并将bubble设置为 false。这意味着一旦该通道记录了消息,该消息将bubble

接下来,使用以下配置添加另一个新通道 custom_debug:

'custom_debug' => [
    'driver' => 'single',
    'level'  => 'debug',
    'path'   => storage_path('logs/debug.log'),
],

此通道也使用单个驱动器,因为它还将消息聚合到一个文件中,该文件是由路径配置定义的 storage/logs/debug.log。它的级别设置为调试,这意味着它将记录任何具有调试或更高级别的消息。

剩下的就是确保我们的默认频道使用这些新创建的频道。转到通道数组中的堆栈通道,通常是数组中的第一项。它应该看起来像这样:

 'stack' => [
     'driver' => 'stack',
     'channels' => ['single'],
     'ignore_exceptions' => false,
],

它使用堆栈驱动程序,如前所述,它允许使用多个通道。这些通道可以在通道配置中设置,默认情况下是一个包​​含一个项目的数组。因此,Laravel 默认将所有消息记录在 storage/logs/laravel.log 中。

我们需要做的是更改堆栈通道的通道配置以使用我们之前创建的自定义日志:

'stack' => [
    'driver' => 'stack',
    'channels' => ['custom_error', 'custom_debug'],
    'ignore_exceptions' => false,
],

一个重要的细节是 custom_error 在数组中位于 custom_debug 之前。由于 custom_debug 具有调试级别,它实际上可以记录所有级别的消息,包括错误消息。我们只希望它记录级别低于“error”的消息,因此,我们赋予 custom_error 更高的优先级,因为它只记录级别为“error”或更高级别的消息,并且会防止消息bubble,因为bubble配置是设置为假。

让我们测试一下。如果您使用的是全新安装的 Laravel,您只需转到 routes/web.php 并在可用的主路由中添加以下内容:

Route::get('/', function () {
    Log::info("this is info message12");
    Log::error("This is error message23");
    return view('welcome');
});

您可以将相同的行添加到任何其他路由或控制器:

//inside controller or route
 Log::info("this is info message");
 Log::error("This is error message");

然后,导航到您添加代码的路线。在第一种情况下,它将是 localhost:8000。之后,让我们检查消息是否记录在正确的文件中。

在项目的根目录下,检查当前存储/日志中的文件:

ls storage/logs

您应该在其他文件中看到 debug.log 和 errors.log(如果还有其他文件)

让我们检查一下 debug.log 的内容:

cat storage/logs/debug.log

它应该具有以下内容:

[TIME] local.ERROR: This is error message

其中 TIME 是记录此消息的日期和时间。请注意,仅记录具有“info”级别的消息,这意味着它是由“custom_debug”通道处理的。

接下来,让我们检查errors.log的内容:

cat storage/logs/errors.log

它应该具有以下内容:

[TIME] local.ERROR: This is error message

其中 TIME 是记录此消息的日期和时间。请注意,仅记录具有“错误”级别的消息,这意味着它由“custom_errors”通道处理。

所以,我们的配置成功了!我们现在将有 2 个单独的日志,一个用于调试消息,一个用于错误消息。

使用 Laravel 可以很容易地自定义日志的处理方式。除了我们制作的示例之外,您还可以尝试为您的日志通道使用不同的驱动程序,例如 slack 或 daily,并且您可以将任意数量的通道添加到堆栈通道。