* * * * *
[TOC]
## 介紹
為了幫助你了解你的應用的運行狀況,Laravel 提供了強大的日志記錄服務,以便你將信息、系統錯誤記錄到文件中,甚至還可以用 Slack 通知你的團隊。
Laravel 的日志系統基于?[Monolog](https://github.com/Seldaek/monolog)?庫,Monolog 提供了多種強力的日志處理程序。在 Laravel 中可以簡單地配置這些處理程序,你可以通過混合使用配置項來自定義應用日志處理程序。
## 配置
所有日志系統相關的配置都在?`config/logging.php`?文件中。你可以在這個文件中配置應用日志記錄通道,通過查看文件可以了解每個可用通道及其選項。接下來我們會查看一些常見的配置。
默認情況下 Laravel 使用?`stack`?通道記錄信息。?`stack`?通道會將多個日志通道集合到單個通道中,到?[下面的文檔](http://www.hmoore.net/tonyyu/laravel_5_6/786183#_31)了解更多有關構建棧的信息。
#### 配置通道名稱
Monolog 在默認情況下會以當前的環境作為「通道名稱」來實例化,例如?`production`?或者?`local`。可以給你的通道配置添加一個?`name`?選項來更改這個值:
~~~
'stack' => [
'driver' => 'stack',
'name' => 'channel-name',
'channels' => ['single', 'slack'],
],
~~~
#### 配置 Slack 通道
`slack`?通道必須要有?`url`?配置項。這個 URL 要和你在 Slack 上配置的?[incoming webhook](https://slack.com/apps/A0F7XDUAZ-incoming-webhooks)?保持一致。
### 構建日志棧
如之前所提,`stack`?驅動可以把多個通道整合到單個通道中。我們可以通過來看一個上線應用示例配置,來展示如何使用日志棧:
~~~
'channels' => [
'stack' => [
'driver' => 'stack',
'channels' => ['syslog', 'slack'],
],
'syslog' => [
'driver' => 'syslog',
'level' => 'debug',
],
'slack' => [
'driver' => 'slack',
'url' => env('LOG_SLACK_WEBHOOK_URL'),
'username' => 'Laravel Log',
'emoji' => ':boom:',
'level' => 'critical',
],
],
~~~
我們來分析一下這份配置。首先,我們注意到?`stack`?通道整合了另外兩個通道,他們的?`channels`?選項分別是:`syslog`?和?`slack`。那么在記錄信息時,這兩個通道都會記錄到該信息。
#### 日志等級
注意到?`syslog`?和?`slack`?通道都有?`level`?這個配置項。該選項用來判斷可以被記錄的信息的最低 「等級」。Laravel 日志服務的基礎庫 Monolog 提供了所有在?[RFC 5424 specification](https://tools.ietf.org/html/rfc5424)?中定義的日志等級:**emergency**、?**alert**、**critical**、?**error**、?**warning**、?**notice**、?**info**?和?**debug**。
我們想象一下用?`debug`?方法來記錄一條信息:
~~~
Log::debug('An informational message.');
~~~
那么鑒于我們的配置,`syslog`?通道會將這條信息記錄到系統日志上;然而在?`critical`?等級之下的錯誤信息并不會發送到 Slack;不過如果我們記錄了一條?`emergency`?等級的信息,它將會被同時發送到?`syslog`?通道和?`slack`?通道,因為?`emergency`?等級高于這兩個通道的最低日志等級:
~~~
Log::emergency('The system is down!');
~~~
## 記錄日志信息
你可以用?`Log`?[facade](http://www.hmoore.net/tonyyu/laravel_5_6/786058)?記錄信息到日志。就如前面提到的,日志處理程序提供了八種在?[RFC 5424 specification](https://tools.ietf.org/html/rfc5424)?里定義的日志等級:**emergency**、?**alert**、**critical**、?**error**、?**warning**、?**notice**、?**info**?和?**debug**。
~~~
Log::emergency($message);
Log::alert($message);
Log::critical($message);
Log::error($message);
Log::warning($message);
Log::notice($message);
Log::info($message);
Log::debug($message);
~~~
所以,你可以調用這些方法來記錄相應等級的信息。信息會被寫入?`config/logging.php`?文件中配置的默認的日志通道:
~~~
<?php
namespace App\Http\Controllers;
use App\User;
use Illuminate\Support\Facades\Log;
use App\Http\Controllers\Controller;
class UserController extends Controller
{
/**
* Show the profile for the given user.
*
* @param int $id
* @return Response
*/
public function showProfile($id)
{
Log::info('Showing user profile for user: '.$id);
return view('user.profile', ['user' => User::findOrFail($id)]);
}
}
~~~
#### 上下文信息
上下文數據也可以用數組的形式傳遞給日志方法。此上下文數據將被格式化并與日志消息一起顯示:
~~~
Log::info('User failed to login.', ['id' => $user->id]);
~~~
### 記錄日志到指定通道
有時候你可能希望將日志記錄到非默認通道。你可以使用?`Log`?Facade 中的?`channel`?方法,將日志記錄到應用配置中存在的任何渠道:
~~~
Log::channel('slack')->info('Something happened!');
~~~
如果你想按需創建多個渠道的日志堆棧,你可以使用?`stack`?方法:
~~~
Log::stack(['single', 'slack'])->info('Something happened!');
~~~
## 自定義 Monolog 日志通道
有時你可能需要完全配置 Monolog 現有的通道。例如:你想要為現有通道自定義一個 Monolog?`FormatterInterface`實現。
首先,在頻道配置文件中定義一個?`tap`?數組。`tap`?數組應該包含所需的類列表,這些類就是 Monolog 實例創建后需要自定義(或開發)的類:
~~~
'single' => [
'driver' => 'single',
'tap' => [App\Logging\CustomizeFormatter::class],
'path' => storage_path('logs/laravel.log'),
'level' => 'debug',
],
~~~
當你完成了通道中?`tap`?選項的配置,你就可以開始寫 Monolog 實例自定義類了。這個類只需要一個方法:?`__invoke`,這個方法可以接收一個?`Illuminate\Log\Logger`?實例。?`Illuminate\Log\Logger`?實例代理了所有 Monolog 實例底層方法調用:
~~~
<?php
namespace App\Logging;
class CustomizeFormatter
{
/**
* 自定義日志實例
*
* @param \Illuminate\Log\Logger $logger
* @return void
*/
public function __invoke($logger)
{
foreach ($logger->getHandlers() as $handler) {
$handler->setFormatter(...);
}
}
}
~~~
> {提示} 所有的「tap」類可以通過?[服務容器](http://www.hmoore.net/tonyyu/laravel_5_6/786056)?解析,所以它們所需的任何構造函數依賴項都會被自動注入。
## 創建自定義通道
如果你想定義一個完全自定義的通道以使你可以通過 Monolog 的實例和配置控制它,你可以在你的?`config/logging.php`?配置文件中定義一個?`custom`?驅動類型。此外,你的配置文件應該包含一個?`via`?選項來指定用于創建 Monolog 實例的類:
~~~
'channels' => [
'custom' => [
'driver' => 'custom',
'via' => App\Logging\CreateCustomLogger::class,
],
],
~~~
當你配置了?`custom`?通道,準備好定義創建 Monolog 實例的類。這個類只需要一個方法:?`__invoke`?,它應該返回一個 Monolog 實例。
~~~
<?php
namespace App\Logging;
use Monolog\Logger;
class CreateCustomLogger
{
/**
* 創建一個 Monolog 實例。
*
* @param array $config
* @return \Monolog\Logger
*/
public function __invoke(array $config)
{
return new Logger(...);
}
}
~~~
- 前言
- 翻譯說明
- 發行說明
- 升級指南
- 貢獻導引
- 入門指南
- 安裝
- 配置信息
- 文件夾結構
- Homestead
- Valet
- 部署
- 核心架構
- 請求周期
- 服務容器
- 服務提供者
- Facades
- Contracts
- 基礎功能
- 路由
- 中間件
- CSRF 保護
- 控制器
- 請求
- 響應
- 視圖
- URL
- Session
- 表單驗證
- 錯誤
- 日志
- 前端開發
- Blade 模板
- 本地化
- 前端指南
- 編輯資源 Mix
- 安全相關
- 用戶認證
- Passport OAuth 認證
- 用戶授權
- 加密解密
- 哈希
- 重置密碼
- 綜合話題
- Artisan 命令行
- 廣播系統
- 緩存系統
- 集合
- 事件系統
- 文件存儲
- 輔助函數
- 郵件發送
- 消息通知
- 擴展包開發
- 隊列
- 任務調度
- 數據庫
- 快速入門
- 查詢構造器
- 分頁
- 數據庫遷移
- 數據填充
- Redis
- Eloquent ORM
- 快速入門
- 模型關聯
- Eloquent 集合
- 修改器
- API 資源
- 序列化
- 測試相關
- 快速入門
- HTTP 測試
- 瀏覽器測試 Dusk
- 數據庫測試
- 測試模擬器
- 官方擴展包
- Cashier 交易工具包
- Envoy 部署工具
- Horizon
- Scout 全文搜索
- Socialite 社會化登錄