# 日志處理
### 日志配置
日志的配置文件是配置文件目錄下的`log.php`文件,系統在進行日志寫入之前會讀取該配置文件進行初始化
```
return [
// 默認日志記錄通道
'default' => 'file',
// 日志記錄級別
'level' => [],
// 日志類型記錄的通道 ['error'=>'email',...]
'type_channel' => [],
// 日志通道列表
'channels' => [
'file' => [
// 日志記錄方式
'type' => 'File',
// 日志保存目錄
'path' => '',
// 單文件日志寫入
'single' => false,
// 獨立日志級別
'apart_level' => [],
// 最大日志文件數量
'max_files' => 0,
],
// 其它日志通道配置
],
];
```
可以添加多個日志通道,每個通道可以設置不同的日志類型。日志配置參數根據不同的日志類型有所區別,內置的日志類型包括:`file`,日志類型使用`type`參數配置即可。
> 如果是自定義驅動,`type`的值則為自定義驅動的類名(包含命名空間)
日志全局配置參數:
| 參數 | 描述 |
| --- | --- |
| default | 默認的日志通道 |
| level | 允許記錄的日志級別 |
| type_channel | 日志類型記錄的通道 |
> 默認的日志類型是`File`方式,可以通過驅動的方式來擴展支持更多的記錄方式。
文件類型日志的話,還支持下列配置參數:
| 參數 | 描述 |
| --- | --- |
| path | 日志存儲路徑 |
| file_size | 日志文件大小限制(超出會生成多個文件) |
| apart_level | 獨立記錄的日志級別 |
| time_format | 時間記錄格式 |
| single | 是否單一文件日志 |
| max_files | 最大日志文件數(超過自動清理 ) |
| format | 日志輸出格式 |
| realtime_write | 是否實時寫入 |
> 為了避免同一個目錄下面的日志文件過多的性能問題,日志文件會自動生成日期子目錄。
### 日志寫入
一般日志是自動寫入的,手動寫入日志使用這兩個方法
>record 方法(記錄日志信息到內存)
```
Log::record('日志信息');
//默認日志級別是info,也可以手動指定
Log::record('這是一條警告日志','notice');
```
>write方法(實時記錄)
```
Log::write('測試日志信息,這是警告級別,并且實時寫入','notice');
```
配置文件中開啟實時寫入
```
// 實時寫入
'realtime_write' => true,
```
### 關閉日志
```
Log::close();
```
### 日志級別
日志的級別從低到高依次為:`debug`,`info`,`notice`,`warning`,`error`,`critical`,`alert`,`emergency`,ThinkPHP額外增加了一個`sql`日志級別僅用于記錄`SQL`日志(并且僅當開啟數據庫調試模式有效)
> 系統發生異常后記錄的日志級別是`error`
```
Log::error('錯誤信息');
Log::info('日志信息');
```
提供助手函數
```
trace('錯誤信息', 'error');
trace('日志信息', 'info');
```
>默認情況下是不會記錄HTTP異常日志(避免受一些攻擊的影響寫入大量日志),除非你接管了系統的異常處理,重寫了`report`方法
### 日志上下文
日志可以傳入上下文信息(數組),并且被替換到日志內容中
```
Log::info('日志信息{user}',['user'=>'張三']);
```
### 獨立日志
為了便于分析,`File`類型的日志還支持設置某些級別的日志信息單獨文件記錄:
```
return [
'default' => 'file',
'channels' => [
'file' => [
'type' => 'file',
// error和sql日志單獨記錄
'apart_level' => ['error','sql'],
],
],
];
```
設置后,就會單獨生成`error`和`sql`兩個類型的日志文件,主日志文件中將不再包含這兩個級別的日志信息
> 如果`apart_level`設置為`true`,則表示所有的日志類型都會獨立記錄
### 單文件日志
默認情況下,日志是按照日期為目錄,按天為文件生成的,但如果希望僅生成單個文件(方便其它的工具或者服務讀取以及分析日志)
```
return [
'default' => 'file',
'channels' => [
'file' => [
'type' => 'file',
'single' => true,
'file_size' => 1024*1024*10,
],
],
];
```
開啟生成單個文件后,`file_size`和`apart_level`參數依然有效,超過文件大小限制后,系統會自動生成備份日志文件。
默認的單文件日志名是`single.log`,如果需要更改日志文件名,可以設置
```
return [
'default' => 'file',
'channels' => [
'file' => [
'type' => 'file',
'single' => 'single_file',
'file_size' => 1024*1024*10,
],
],
];
```
那么實際生成的日志文件名是`single_file.log`,如果設置了`apart_level`的話,可能還會生成`single_file_error.log`之類的日志
> 單文件日志也支持`max_files`參數設置,因為單文件日志同樣會生成多個日志備份文件而導致日志文件數據過大
### 寫入處理
日志支持寫入回調處理,通過事件的方式處理。
```
Event::listen('think\event\LogWrite', function($event) {
if('file' == $event->channel) {
$event->log['info'][] = 'test info';
}
});
```
### 格式化日志信息
系統提供了兩個參數用于日志信息的格式化,第一個是用于自定義時間顯示格式的`time_format`,第二個是調整日志輸出格式的`format`參數
```
return [
'default' => 'file',
'channels' => [
'file' => [
'type' => 'file',
'json' => true
'file_size' => 1024*1024*10,
'time_format' => 'Y-m-d H:i:s',
'format' => '[%s][%s]:%s',
],
],
];
```
### 清空日志
一旦執行`save`方法后,內存中的日志信息就會被自動清空,如果需要手動清空可以使用:
```
Log::clear();
```
在清空日志方法之前,你可以使用`getLog`方法獲取內存中的日志。
```
// 獲取全部日志
$logs = Log::getLog();
```
> 日志清空僅僅是清空內存中的日志。
### 日志自動清理
文件類型的日志支持自動清理。可以設置`max_files`參數,超過數量的最早日志將會自動刪除。
```
return [
'default' => 'file',
'channels' => [
'file' => [
'type' => 'file',
'max_files' => 30,
'file_size' => 1024*1024*10,
],
],
];
```
> 設置`max_files`參數后,日志文件將不會分日期子目錄存放。
### JSON格式日志
可以支持`JSON`格式記錄文件日志,更加方便一些第三方日志分析工具進行日志分析。
```
return [
'default' => 'file',
'channels' => [
'file' => [
'type' => 'file',
'json' => true
'file_size' => 1024*1024*10,
],
],
];
```
即可開啟`JSON`格式記錄,CLI命令行的日志記錄同樣有效。
使用JSON格式記錄后,每次請求是一行JSON數據,但如果使用`Log::write`記錄的日志是例外的單獨一行JSON數據。
### 日志通道
你可以配置不同的日志通道,并且把不同的日志記錄到不同的通道。
```
Log::channel('email')->info('一條測試日志');
Log::channel('socket')->error('記錄錯誤日志');
```
你可以配置不同的日志類型,記錄到不同的日志通道,這樣在記錄日志的時候會自動選擇對應的通道寫入。
```
return [
'default' => 'file',
'type_channel' => [
'error' => 'email',
'sql' => 'sql',
],
'channels' => [
'file' => [
'type' => 'file',
],
'email' => [
'type' => 'email',
],
'sql' => [
'type' => 'sql',
],
],
];
```
表示如果是`error`日志和`sql`日志,會分別記錄到指定的通道。同時你還需要在日志配置文件中,添加`email`和`sql`日志通道的配置。核心只有`file`日志類型,其它的可能需要自己擴展或者安裝擴展。
如果需要獲取內存中的通道日志信息,可以使用
```
// 獲取某個日志通道的日志
$error = Log::getLog('file');
```
可以單獨關閉某個通道的日志寫入,只需要把日志通道的`close`配置參數設置為`true`,或者使用方法關閉。
```
Log::close('file');
```
可以單獨清空某個通道的日志(如果沒有開啟實時寫入的話)
```
Log::clear('file');
```
### 自定義驅動
如果需要自定義日志驅動,你需要實現`think\contract\LogHandlerInterface`接口。
```
interface LogHandlerInterface
{
/**
* 日志寫入接口
* @access public
* @param array $log 日志信息
* @return bool
*/
public function save(array $log): bool;
}
```
- 序言
- 系統簡介
- 系統介紹
- 前端腦圖
- 項目介紹
- 新手入門(源碼安裝)
- 運行環境
- 服務器配置及安裝
- 視頻安裝教程
- 服務器及環境搭建
- 服務器購買
- 域名購買
- 域名解析
- 服務器配置
- 寶塔配置
- 創建站點
- 安裝項目
- 1.源碼上傳(必看內容)
- 2.PHP擴展安裝
- 3.環境配置
- 4.運行服務
- 5.一鍵安裝
- 注意事項(很重要)
- 重啟swoole服務
- linux安裝swoole方法
- 特別注意事項
- mysql 5.7注意事項
- https域名
- ssl證書申請
- 公眾號配置
- 公眾號配置
- 公眾號開發配置
- 公眾號菜單
- 設置公眾號菜單
- 關鍵字
- 跳轉網頁
- 跳轉小程序
- 小程序配置
- 1.微信平臺配置
- 2.CRMEB后臺配置
- 3.前端提交審核
- 4.確認發布
- 支付配置
- 支付配置
- 公眾號支付
- 小程序支付
- 支付寶支付
- 其他配置
- 公眾號模板消息
- 小程序訂閱消息
- 商業授權
- 授權說明
- 申請授權
- 安裝常見問題匯總
- 請修改sql_mode文件為NO_AUTO提示
- 版本更新
- 客服設置
- uni-app 打包H5、公眾號
- 版本更新
- 清空數據
- 測試域名
- 部署多套多商戶
- 使用說明
- 商品分類
- 分類說明
- 分類管理
- 品牌分類
- 商品標簽
- 商品管理
- 發布商品
- 商品規格
- 配置說明
- 文件上傳
- 移動端展示說明
- 首頁
- 分類頁
- 個人中心
- 熱門搜索
- 分銷規則
- 分銷配置
- 分銷員管理
- 分銷規則說明
- 分銷員等級
- 分銷禮包
- 傭金說明
- 用戶管理
- 商戶用戶管理
- 平臺用戶管理
- 用戶協議
- 用戶搜索記錄
- 秒殺
- 秒殺規則
- 開啟秒殺活動
- 直播
- 主播實名認證
- 開啟直播
- 添加直播商品
- 預售
- 開啟全款預售
- 開啟定金預售
- 預售協議
- 專題
- 后臺配置
- 前端展示
- 助力
- 開啟助力
- 查看助力活動
- 拼團
- 虛擬拼團設置
- 開啟拼團
- 查看拼團活動
- 積分
- 積分設置
- 積分來源
- 積分使用
- 提現
- 提現規則
- 提現步驟
- 新聞資訊
- 新聞頁面
- 發布資訊
- 賬戶管理
- 賬號信息
- 賬戶資金
- 優惠券
- 添加優惠券
- 發布優惠券
- 領取及使用
- 發放優惠券
- 訂單管理
- 后臺訂單處理
- 前端訂單處理
- 訂單退款
- 訂單打印
- 客服管理
- 添加客服
- 客服權限
- 門店自提
- 開啟門店自提
- 設置核銷權限
- 訂單核銷說明
- 商戶管理
- 商戶分類
- 商戶入駐
- 商戶列表
- 商戶菜單管理
- 店鋪類型
- 財務
- 財務對賬
- 發票管理
- 自動分賬(v1.5及以后版本)
- 郵費說明
- 運費設置
- 運費組成
- 運費模板
- 物流配置
- 公告管理
- 店鋪相關
- 店鋪定位設置
- 店鋪街入口
- 店鋪活動
- 店鋪基本信息設置
- 小票打印
- 小票打印機配置
- 小票打印機設置
- 技術文檔
- 開發規范
- 數據字典
- 目錄結構
- 移動端路由
- 系統配置
- 后臺表單說明
- 短信設置
- 短信賬戶
- 短信配置
- 短信模板
- 一號通
- 電子面單
- 短信提醒
- 商品采集
- 物流查詢
- 付費采集商品配置
- PC端展示說明
- PC端開啟
- PC端平臺頁面配置
- PC端店鋪頁面配置
- 保障服務
- 移動端商品管理
- 開啟移動端商品管理
- 功能說明
- 會員管理
- 會員管理
- 會員權益
- 會員配置
- 社區功能
- 社區分類
- 社區話題
- 社區文章
- 社區評論
- 社區配置
- 通知管理
- 移動前端
- 目錄結構
- 配置說明
- 頁面路徑
- 后臺前端說明
- 總后臺目錄結構
- 商戶后臺目錄結構
- 開發和構建
- APP 打包
- 基礎配置
- 開發調試
- 打包上線
- App打包
- PC端說明
- 安裝教程
- 目錄結構
- 打包教程
- 常見問題
- 服務器問題
- 服務器環境說明
- MySQL 5.7注意事項
- PHP fileinfo擴展安裝
- 后臺登錄頁幻燈片
- 后臺登錄頁logo
- 論壇常見問題匯總
- 個人中心菜單加鏈接
- 子賬號登錄名
- 前后端分離配置
- 重啟swoole進程
- 開論壇勛章
- 源碼下載地址
- 查看/隱藏版本號
- 搜索商品后服務掛了
- 開發文檔
- 架構
- config配置文件
- 容器和依賴注入
- 異常處理
- 路由
- 控制器模塊
- 日志處理
- 自定義指令
- CRMEB類庫
- Basic基類
- Exceptions異常處理
- Interfaces接口類
- Jobs消息隊列
- services服務類
- traits
- listens定時監聽類
- 接口流程
- Controller
- Repository
- Dao
- Model
- 流程
- 訂單流程
- 下單流程
- 退款流程
- 二開教程
- 定義新的接口
- 創建新的頁面
- 創建新的組合數據
- 更換短信模板