<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                ### 2018 年 10 月 25 日 發布 日志是一個應用必不可少的功能組件,在某種程度上來說甚至具有不可替代的作用,無論是調試模式還是部署模式。 ThinkPHP5的日志功能非常強大,足以滿足大部分的應用場景。 ## 日志記錄 除了系統自動生成的日志外,如果你需要添加自己的應用日志,可以使用`trace`助手函數或者`Log`類記錄日志。 ``` trace('日志信息', '日志類型'); // 或者使用 \think\facade\Log::record('日志信息', '日志類型'); // 實時寫入日志 \think\facade ``` >[info] 日志記錄對于命令行和WEB訪問有一個明顯的差別就是命令行的日志記錄是實時寫入日志文件的(原因是為了避免內存中的日志記錄開銷過大,`Swoole`和`Workerman`也屬于命令行常駐運行),而WEB訪問則在每次請求完成后統一寫日志文件。 按照`PSR-3`日志規范,日志的級別從低到高依次為: `debug`, `info`, `notice`, `warning`, `error`, `critical`, `alert`, `emergency`,ThinkPHP額外增加了一個`sql`日志級別僅用于記錄`SQL`日志(并且僅當開啟數據庫調試模式有效)。當然,你仍然可以增加自己的額外日志類型。 原則上,在開發調試階段,我們不應該錯過任何的錯誤信息,而在部署階段,可以有選擇的記錄某些日志類型從而避免日志文件過大。 調整日志配置文件的配置參數: ``` // 允許記錄的日志類型 'level' => ['error', 'critical', 'alert', 'emergency'], ``` >[danger] 敏感信息應該盡量記錄在`debug`日志類型中,系統在部署模式下,默認會自動忽略`debug`類型的日志(除非你明確允許記錄`debug`類型日志),確保日志泄露后可能造成的安全性。 ## 日志管理 日志文件最好有一個統一的管理策略,例如在項目中規范日志的大小、數量以及采用的日志記錄類型。 目前框架內置的日志記錄類型包括文件類型和`Socket`類型,`Socket`類型主要用于遠程調試,具體用法可以參考官方的快速入門教程的[API調試](http://www.hmoore.net/thinkphp/thinkphp5_quickstart/478323)一章,這里不再敘述。我們主要以文件類型日志為例來講述日志管理。 日志管理策略主要包含如下配置參數,你可以根據你的實際需求進行配置。 ### 日志大小(`file_size`) 默認的日志文件大小是2097152字節(2M),超過設置的日志大小,會自動生成日志備份文件。實際應用中建議適當調大一些,可以避免日志文件過多。 ### 日志數量(`max_files`) 默認情況下,日志是永久保存(直到存儲占滿為止),為了避免日志文件過大(一個月下來幾十個G都有),建議設置一個最大日志文件數量,例如保留最近`50`個日志文件,超過后會自動刪除最早的一個日志文件。 ### 獨立類型日志(`apart_level`) 如果你需要,可以設置某些級別的日志信息單獨文件記錄,方便你直接查看相關類型的問題,例如: ``` // error和sql日志單獨記錄 'apart_level' => ['error', 'sql'], ``` 設置后,就會單獨生成`error`和`sql`兩個類型的日志文件,主日志文件中將不再包含這兩個級別的日志信息。 如果需要所有日志類型單獨記錄文件的話,可以直接設置`apart_level`為`true`。 ### 單一日志(`single`) 默認情況下的日志是按照日期為目錄,按天為文件生成的(例如`201809/03.log`這種)但如果希望僅生成單個文件(方便其它的工具或者服務讀取以及分析日志)。 ``` 'single' => true, ``` 開啟生成單個文件后,`file_size`、`apart_level`和`max_files`參數依然有效,超過文件大小限制后,系統會自動生成備份日志文件。 所以,一般開啟單一日志后,建議調大日志大小(例如10M)。 >[info] 如果需要和阿里云的日志服務對接,可以設置為單一日志,更加方便阿里云的日志文件讀取。 ### JSON日志(`json`) 為了方便日志的后期分析,你可以設置使用`JSON`格式記錄日志,開啟后每次記錄的日志會統一編碼成`JSON`格式(目前`5.0`最新版本也支持`JSON`格式日志了)。 在日志配置文件中,添加 ``` 'json' => true, ``` 即可開啟JSON格式記錄,對于命令行的日志記錄同樣有效。 >[danger] JSON格式記錄日志的時候,獨立記錄日志級別參數`apart_level`無效。 ## 告警通知 如果你需要加上錯誤日志的告警通知,可以利用日志類提供的兩個鉤子。 鉤子|描述|參數 ---|---|--- log_level|不同類型的日志寫入|[ 日志類型, 日志信息(數組)] log_write|write方法或者命令行日志寫入|日志信息 我們可以添加行為來進行日志的通知,下面是一個很簡單的發送郵件通知的行為類。 ``` <?php namespace app\index\behavior; class SendMail { public function run($params) { // 發送郵件通知 list($type, $message) = $params; if ('error' == $type) { mail('admin@mail.com', '系統日志通知', implode(' ', $message)); } } } ``` 綁定行為 ``` \think\facade\Hook::add('log_level', 'app\index\behavior\SendMail'); ``` 這樣就可以在發生錯誤日志的時候自動郵件通知管理員。 `5.0`版本沒有`log_level`鉤子,但你仍然可以用`response_end`鉤子,然后在行為里面獲取當前的日志信息來進行處理。 ``` <?php namespace app\index\behavior; use think\facade\Log; class SendMail2 { public function run($params) { // 發送郵件通知 $logs = Log::getLog('error'); mail('admin@mail.com', '系統日志通知', implode(' ', $logs)); } } ``` >[danger] 以上方法同樣也適用于`5.1`版本。如果你的應用壓力較大,也可以通過把日志告警通知加入隊列,在行為中不做具體的通知,只是加入通知隊列。 如果你已經使用了阿里云的[日志服務](https://www.aliyun.com/product/sls/),那么可以對接ThinkPHP的日志文件,最好是開啟JSON日志格式,便于阿里云的分析和查詢,那么可以直接使用阿里云的日志告警和通知服務,具體可以參考阿里云的產品服務文檔。 ## 擴展驅動 如果你覺得內置的日志驅動仍然不能滿足你的日志調試或者通知需求,你還可以自己擴展日志驅動。 擴展一個日志驅動很簡單,只需要在應用類庫中擴展不需要修改核心。下面是一個很簡單的使用`SeasLog`記錄日志的驅動。 ``` <?php namespace app\driver\log; use think\App; class SeasLog { protected $config = []; // 實例化并傳入參數 public function __construct(App $app, $config = []) { $this->config = array_merge($this->config, $config); \SeasLog::setBasePath($this->config['path']); if ($this->config['logger']) { \SeasLog::setLogger($this->config['logger']); } } /** * 日志寫入接口 * @access public * @param array $log 日志信息 * @param bool $append 是否追加請求信息 * @return bool */ public function save(array $log = [], $append = false) { foreach ($log as $type => $val) { \SeasLog::log($type, implode("\n\r", $val)); } return \SeasLog::flushBuffer(); } ``` 更詳細的實現可以參考`think-seaslog`擴展。 最后,你只需要在`log.php`配置文件中設置`type`參數為 ``` 'type' => 'app\driver\log\SeasLog', ```
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看