<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國際加速解決方案。 廣告
                ##PHP日志接口規范 關于日志系統,PHP規范給出了相當好的說明和定義,請見: [Logger Interface](http://www.php-fig.org/psr/psr-3/) ![apic](http://webtools.qiniudn.com/20150411005257_2caf170c179348eca546ba5332837d09) ##1.17.1 簡化版 但在用過這么多開源框架進行各種項目開發,以及內部框架的開發后,發現實際上日志的分類并沒有使用得這么豐富,而通常只是頻繁地幾類。因此,為了減少不必要的復雜性,這里特地精簡為三種,只有: + error 系統異常類 + info 業務紀錄類 + debug 開發調試類 現分說如下。 ###(1)error 系統異常類 此類是后臺開發同學認為 **不應該發生卻發生的事情 ** ,即我們通常所說的系統異常。 如:調用app store支付的接口失敗了,我們需要紀錄一下當時的場景,以便復查和給用戶補嘗其損失。 又如:寫入一條紀錄到數據紀錄,但失敗了,我們需要紀錄一下,以便排查。 用法很簡單,如: ```javascript //只有描述 DI()->logger->error('fail to insert DB'); //描述 + 簡單的信息 DI()->logger->error('fail to insert DB', 'try to register user dogstar'); //描述 + 當時的上下文數據 $data = array('name' => 'dogstar', 'password' => '123456'); DI()->logger->error('fail to insert DB', $data); ``` 上面三條紀錄,效果類如: ```javascript dogstar@ubuntu:dev.phalapi.com$ tailf ./Runtime/log/201502/20150207.log 2015-02-07 20:37:55|ERROR|fail to insert DB 2015-02-07 20:37:55|ERROR|fail to insert DB|try to register user dogstar 2015-02-07 20:37:55|ERROR|fail to insert DB|{"name":"dogstar","password":"123456"} ``` 截圖效果: ![apic](http://webtools.qiniudn.com/20150411005257_37a0566c79a78c8958d8d00a83c7f840) ###(2)info 業務紀錄類 此類通常為業務需要進行必要的操作紀錄,以便發生系統問題后的回滾處理、問題排查以及數據統計。 如在有緩存的情況下,可能數據沒及時寫入數據庫而導致數據丟失或者回檔,這里可以通過日志簡單查看是否可以恢復。以及說明一下操作發生的背景或原由,如通常游戲中用戶的經驗值添加: ```javascript //假設:10 + 2 = 12 DI()->logger->info('add user exp', array('name' => 'dogstar', 'before' => 10, 'addExp' => 2, 'after' => 12, 'reason' => 'help one more phper')); //對應的LOG 2015-02-07 20:48:51|INFO|add user exp|{"name":"dogstar","before":10,"addExp":2,"after":12,"reason":"help one more phper"} ``` 但當哪天我們看到以下的LOG是就會發現系統存在隱藏的BUG: ```javascript //WTF? 10 + 2 = 11 ??? 2015-02-07 20:48:51|INFO|add user exp|{"name":"dogstar","before":10,"addExp":2,"after":11,"reason":"help one more phper"} ``` 而當用戶玩家來投訴客服時,客服妹子來找到我們后臺開發時,我們可以證明得了是系統原因造成了用戶丟失1點經驗值。 特別地,若我們看到以下的LOG時,不難看出有人在用非法的渠道刷經驗: ```javascript 2015-02-07 20:52:35|INFO|add user exp|{"name":"dogstar","before":10,"addExp":2,"after":12,"reason":"help one more phper"} 2015-02-07 20:52:35|INFO|add user exp|{"name":"dogstar","before":12,"addExp":2,"after":14,"reason":"help one more phper"} .... 2015-02-07 20:52:35|INFO|add user exp|{"name":"dogstar","before":998,"addExp":2,"after":1000,"reason":"help one more phper"} ``` 所幸我們有日志并及時發現了,隨后如何處理就視具體的項目而定了。但當產品來追問時,我們可以及時給出反饋和做出處理。 還有更為重要的是 **數據統計** 。這塊就App數據分析和統計這塊已經有了很好的第三方服務支持,一如:友盟。但我們仍然可以輕松實現自己的數據統計,以便二次確認和定制化。畢竟,總是依賴第三方不是那么輕便,而且存在敏感數據安全問題。 這里簡單提供一個上報接口,如: ```javascript public function getRules() { return array( 'report' => array( 'username' => array('name' => 'username', 'require' => true), 'msg' => array('name' => 'msg', 'require' => true), ), ); } public function report() { DI()->logger->info($this->username, $this->msg); } ``` 客戶端在需要的場景,如用戶打開應用,請求: ``` http://dev.phalapi.com/demo/?service=DogstarTest.Report&username=dogstar&msg=enter%20app ``` 即可看到: ```javascript 2015-02-07 21:01:13|INFO|dogstar|enter app ``` 到后期,若我們需要統計用戶的登錄情況時,可以這樣統計: ```javascript $ cat ./Runtime/log/201502/20150207.log | grep "enter app" | awk -F '|' '{print $3}' | sort | uniq -c 11 dogstar 5 King 2 Tom ``` ###(3)debug 開發調試類 此類為開發調試用,用法如上,這里不再贅述。以下是一些簡單的示例: ```javascript DI()->logger->debug('just for test'); DI()->logger->debug('just for test', '一些其他的描述 ...'); DI()->logger->debug('just for test', array('name' => 'dogstar', 'password' => '******')); ``` ##1.17.2 使用DI()->logger->log()進行更靈活的分類 若上面的error/info/debug都不能滿足項目的需求時,可以這樣更靈活地進行日志紀錄: ```javascript DI()->logger->log('demo', 'add user exp', array('name' => 'dogstar', 'after' => 12)); DI()->logger->log('test', 'add user exp', array('name' => 'dogstar', 'after' => 12)); //對應的日志 2015-02-07 21:13:27|DEMO|add user exp|{"name":"dogstar","before":10,"addExp":2,"after":12,"reason":"help one more phper"} 2015-02-07 21:15:39|TEST|add user exp|{"name":"dogstar","after":12} ``` 注意到,DI()->logger->log()第一個參數為日志分類的名稱,在寫入日志時會自動轉換為大寫。其接口函數簽名為: ```javascript /** * 日志紀錄 * * 可根據不同需要,將日志寫入不同的媒介 * * @param string $type 日志類型,如:info/debug/error, etc * @param string $msg 日志關鍵描述 * @param string/array $data 場景上下文信息 * @return NULL */ abstract public function log($type, $msg, $data); ``` ##1.17.3 別忘記了日志的級別設置 上面的三類日志分別對應的標識為: + error 系統異常類:PhalApi_Logger::LOG_LEVEL_ERROR + info 業務紀錄類:PhalApi_Logger::LOG_LEVEL_INFO + debug 開發調試類:PhalApi_Logger::LOG_LEVEL_DEBUG 根據不同的項目在不同環境下的需要,我們可以這樣有選擇性地將需要的日志分類寫入保存: ```javascript //日志紀錄 DI()->logger = new PhalApi_Logger_File(API_ROOT . '/Runtime', PhalApi_Logger::LOG_LEVEL_DEBUG | PhalApi_Logger::LOG_LEVEL_INFO | PhalApi_Logger::LOG_LEVEL_ERROR); ``` 多個日志級別需要使用或運算進行組合。 ##1.17.4 擴展你的日志存儲 普遍情況下,我們認為將日志存放在文件是比較合理的,因為便于查看、管理和統計。當然,如果你的項目需要將日志紀錄在數據中,也可以快速擴展實現。如實現數據庫的存儲思路: ```javascript //$ vim ./Apps/Common/Logger/DB.php class Common_Logger_DB extends PhalApi_Logger { public function log($type, $msg, $data) { //TODO 數據庫的日志寫入 ... } ``` 隨后,利用DI注冊一下即可: ```javascript //日志紀錄 - DB DI()->logger = new Common_Logger_DB($dbConfig, PhalApi_Logger::LOG_LEVEL_DEBUG | PhalApi_Logger::LOG_LEVEL_INFO | PhalApi_Logger::LOG_LEVEL_ERROR); ```
                  <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>

                              哎呀哎呀视频在线观看