<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>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                ~~~ ?php //第一步: //在application/core文件夾下新建MY_CILog.php文件 <?php /** * 日志模塊 * @author caisicen * @date 2017-08-23 */ class MY_CILog { private $_log_path; //日志文件存放路徑 private $_date_path; //此刻記錄日志存放的文件夾 private $_file_permissions; //日志文件權限 private $_date_fmt; //存放格式 private $_enabled; //是否開啟日志記錄 private $_threshold; //日志記錄級別 private $_levels; //級別對應值 private $_debugInfo; //是否開啟詳細調試信息 private $_allLog_controller; //包含的控制器將會記錄所有的日志級別記錄 public function __construct() { $this->_file_permissions = 0644; $this->_date_fmt = 'Y-m-d H:i:s'; $this->_enabled = TRUE; $this->_threshold = 1; $this->_levels = array('ERROR' => 1, 'DEBUG' => 2, 'INFO' => 3, 'ALL' => 4); $this->_debugInfo = TRUE; $this->_allLog_controller = array(); $config = & get_config(); //獲取config配置信息 $this->_log_path = ($config['CILog_path'] !== '') ? $config['CILog_path'] : APPPATH . 'CIlogs/'; //日志文件夾根目錄地址 if (!$this->_mkdir()) //創建日志存放結構失敗或者不可寫,則不記錄日志 $this->_enabled = FALSE; if (is_numeric($config['CILog_threshold'])) { //獲取配置文件的日志記錄級別 $this->_threshold = (int) $config['CILog_threshold']; } if (!empty($config['CILog_date_fmt'])) { //獲取日志記錄的時間格式 $this->_date_fmt = $config['CILog_date_fmt']; } if (!empty($config['CILog_file_permissions']) && is_int($config['CILog_file_permissions'])) { //獲取生成文件的文件去那些 $this->_file_permissions = $config['CILog_file_permissions']; } $this->_debugInfo = $config['CILog_debugInfo']; //是否開啟調試信息和瀏覽器信息 !empty($config['CILog_allLog_controller']) && $this->_allLog_controller = $config['CILog_allLog_controller']; //是否有特殊控制器 if (!empty($this->_allLog_controller)) { //將特殊控制器中的所有值轉為小寫 foreach ($this->_allLog_controller as &$controller) { $controller = strtolower($controller); } } } /** * 記錄日志 * @param type $level 級別 * @param type $msg 日志內容 * @param type $onlyMain 是否只將日志記入主流程 */ public function write_log($level, $msg, $onlyMain = false) { $level = strtoupper($level); if ($this->_enabled === FALSE) { //文件夾創建失敗或者無法讀取,則失敗 return FALSE; } //根據配置文件判斷是否記錄此類型的日志 if ((!isset($this->_levels[$level]) OR ( ($this->_levels[$level] > $this->_threshold) && !in_array(strtolower(REQUEST_CLASS), $this->_allLog_controller) ))) { return FALSE; } $mainfilePath = $this->_date_path . 'Main.log'; //main Log的存放路徑 $filePath = $this->_date_path . 'Class-' . REQUEST_CLASS . '.log'; //當前控制器的存放路徑 $message = ''; //待寫入的日志內容 //根據配置文件的日期參數獲取寫入文件的日期格式內容 if (strpos($this->_date_fmt, 'u') !== FALSE) { $microtime_full = microtime(TRUE); $microtime_short = sprintf("%06d", ($microtime_full - floor($microtime_full)) * 1000000); $date = new DateTime(date('Y-m-d H:i:s.' . $microtime_short, $microtime_full)); $date = $date->format($this->_date_fmt); } else { $date = date($this->_date_fmt); } //判斷是否第一次生成文件 if (!is_file($mainfilePath)) { $notMainFile = true; } if (!is_file($filePath) && !$onlyMain) { $notClassFile = true; } $message = $this->_disposalData($level, $date, $msg); //拼接每條日志的記錄 file_put_contents($mainfilePath, $message, FILE_APPEND | LOCK_EX); //將內容追加寫入主日志文件 if (!$onlyMain) { //如果不是設置只寫主日志文件,默認都寫入對應的控制器日志文件 file_put_contents($filePath, $message, FILE_APPEND | LOCK_EX); //將內容追加寫入主日志文件 } //修改新生成的日志文件的權限 if (isset($notMainFile) && $notMainFile === TRUE) { chmod($mainfilePath, $this->_file_permissions); } if (isset($notClassFile) && $notClassFile === TRUE) { chmod($filePath, $this->_file_permissions); } return TRUE; } /** * 創建文件夾結構 * @return boolean */ private function _mkdir() { file_exists($this->_log_path) OR mkdir($this->_log_path, 0777, TRUE); if (!is_dir($this->_log_path) OR ! is_really_writable($this->_log_path)) { return FALSE; } $datePath = $this->_log_path . date('Y-m-d', time()) . '/'; //創建以此刻日期為文件名的文件夾 file_exists($datePath) OR mkdir($datePath, 0777, TRUE); if (!is_dir($datePath) OR ! is_really_writable($datePath)) { return FALSE; } $this->_date_path = $datePath; return TRUE; } /** * 拼裝日志記錄信息 * @param type $level 級別 * @param type $date 時間 * @param type $message 日志內容 * @return type */ private function _disposalData($level, $date, $message) { if ($level == 'INFO') $level = "$level "; //如果是INFO的日志,多加個空格,日志格式整齊一些 $msg = '級別:' . $level . ' | 時間:' . $date . ' | 標識號:' . IDNUM . ' | 請求的url:' . REQUEST_CLASS . "/" . REQUEST_METHOD . PHP_EOL; $msg .= ' 內容:' . $message . PHP_EOL; if (version_compare(phpversion(), '5.4.0') >= 0) { //debug_backtrace函數只有在5.4以上才支持第二個參數 $debugInfo = debug_backtrace(DEBUG_BACKTRACE_PROVIDE_OBJECT, 4); //獲取調試信息 } else { $debugInfo = debug_backtrace(); } //開啟了調試信息配置且是ERROR級別且是由自定義的日志報錯,才顯示調試信息和瀏覽器信息 if (($this->_debugInfo or in_array(strtolower(REQUEST_CLASS), $this->_allLog_controller)) && $level == "ERROR" && $debugInfo[3]['function'] !== 'write_log') { $msg .= ' 調試信息:在' . $debugInfo[2]['file'] . "中的第{$debugInfo[2]['line']}行中調用記錄日志方法,包含在{$debugInfo[3]['function']}方法中"; if (isset($debugInfo[3]['file'])) $msg .= ",調用{$debugInfo[3]['function']}的是{$debugInfo[3]['file']}中的{$debugInfo[3]['line']}行"; if (!empty($debugInfo[3]['args'])) { $msg .= ",傳入{$debugInfo[3]['function']}方法的參數值序列化后為:" . serialize($debugInfo[3]['args']) . PHP_EOL; } else { $msg .= ",無參數傳入" . PHP_EOL; } $input = load_class('INPUT', 'core'); //加載INPUT輔助類 //拼接IP地址和瀏覽器版本信息 $msg .= " 瀏覽器信息:IP地址為{$input->ip_address()},使用的瀏覽器是:" . $this->_getBrowser() . "(" . $this->_getBrowserVersion() . "版本)"; //拼接訪問方式 $msg .= ",訪問方式為:" . $input->method(); if ($input->is_ajax_request()) //是否以ajax訪問 $msg .= ",以ajax形式訪問"; if ($input->is_cli_request()) //是否以cli訪問 $msg .= ",以cli形式訪問"; $HTTP_REFERER = $input->server('HTTP_REFERER'); if (!empty($HTTP_REFERER)) //能夠獲取上個來源頁 $msg .= ",上個來源頁是:{$input->server('HTTP_REFERER')}"; $get = $input->get(); if (!empty($get)) //如果傳入的get參數不為空 $msg .= ",傳入的get參數序列化后為:" . serialize($input->get()); $post = $input->post(); if (!empty($post)) //如果傳入的post參數不為空 $msg .= ",傳入的post參數序列化后為:" . serialize($input->post()); // if (strlen($input->raw_input_stream) > 0) { //如果傳入的input流不為空 // $msg .= ",傳入的input流序列化后為:". serialize($input->raw_input_stream); // } // $msg .= PHP_EOL; //換行符 if (isset($_SESSION)) $msg .= " SESSION信息序列化后為:" . serialize($_SESSION) . PHP_EOL; } $msg .= PHP_EOL; //換行符 return $msg; } /** * 獲取瀏覽器類型。 * @return string */ private function _getBrowser() { if (empty($_SERVER['HTTP_USER_AGENT'])) return 'unknow'; $agent = $_SERVER["HTTP_USER_AGENT"]; if (strpos($agent, 'MSIE') !== false || strpos($agent, 'rv:11.0')) { return "ie"; } else if (strpos($agent, 'Firefox') !== false) { return "firefox"; } else if (strpos($agent, 'Chrome') !== false) { return "chrome"; } else if (strpos($agent, 'Opera') !== false) { return 'opera'; } else if ((strpos($agent, 'Chrome') == false) && strpos($agent, 'Safari') !== false) { return 'safari'; } else { return 'unknown'; } } /** * 獲得瀏覽器版本號 * @return string */ private function _getBrowserVersion() { if (empty($_SERVER['HTTP_USER_AGENT'])) return 'unknow'; $agent = $_SERVER['HTTP_USER_AGENT']; if (preg_match('/MSIE\s(\d+)\..*/i', $agent, $regs)) { return $regs[1]; } else if (preg_match('/FireFox\/(\d+)\..*/i', $agent, $regs)) { return $regs[1]; } else if (preg_match('/Opera[\s|\/](\d+)\..*/i', $agent, $regs)) { return $regs[1]; } else if (preg_match('/Chrome\/(\d+)\..*/i', $agent, $regs)) { return $regs[1]; } else if ((strpos($agent, 'Chrome') == false) && preg_match('/Safari\/(\d+)\..*$/i', $agent, $regs)) { return $regs[1]; } else if (preg_match('/rv:(\d+)\..*/i', $agent, $regs)) { return $regs[1]; } else { return 'unknow'; } } } ?> //********************************************************* //第二步: //在application下的config文件夾下config.php文件中追加 /* |-------------------------------------------------------------------------- | 自定義的日志記錄配置 |-------------------------------------------------------------------------- | */ $config['CILog_path'] = ''; //默認在application下的CIlogs下 $config['CILog_file_permissions'] = 0644; //生成文件的權限 $config['CILog_date_fmt'] = 'Y-m-d H:i:s'; //日志內容中的時間格式 $config['CILog_threshold'] = 4; //記錄日志的級別,默認記錄全部。1-ERROR 2-DEBUG 3-INFO 4-ALL 0-不記錄 $config['CILog_debugInfo'] = true; //true時開啟詳細調試信息和瀏覽器信息,false時關閉。 $config['CILog_allLog_controller'] = array(); //所有信息都記錄的控制器,包含的話,則無論CILog_threshold、CILog_debugInfo如何設置,都將會記錄該控制器下所有日志內容 //********************************************************* //第三步:、 // 在system\core\CodeIgniter.php下,找到$LANG=& load_class('Lang', 'core'); 在這行代碼之后追加 /* * ------------------------------------------------------ * 加載日志類 * ------------------------------------------------------ */ $CILog =& load_class('CILog', 'core'); defined('REQUEST_CLASS') or define('REQUEST_CLASS', $RTR->class); //請求的控制器名 defined('REQUEST_METHOD') or define('REQUEST_METHOD', $RTR->method); //請求的控制器名 defined('IDNUM') or define('IDNUM', uniqid()); //************************************************************ //第四步: //在system\core\Log.php中的write_log方法中,在方法開頭增加 //自定義的CILog類總需記錄ERROR類型的報錯 if(strtoupper($level) == 'ERROR') { logMsg('error', $msg, true); } //******************************************************* //第五步: //在system\core\Common.php中增加 if (!function_exists('logMsg')) { /** * 記錄自定義的日志信息 * @staticvar type $_log 靜態變量存放日志對象(單例) * @param type $level 級別 level: 'error', 'debug' or 'info' * @param type $message 日志內容 * @param type $onlyMain 是否只將日志記入主流程 */ function logMsg($level, $message, $onlyMain = false) { static $_logObj; if ($_logObj === NULL) { $_logObj[0] = & load_class('CILog', 'core'); } $_logObj[0]->write_log($level, $message, $onlyMain); } } //********************************************************* // //以下為解決版本低與調用.能正常運行可忽略 //* 如果CI的版本過低,system\core\Input.php中不包含method方法,則增加 public function method($upper = FALSE) { return ($upper) ? strtoupper($this->server('REQUEST_METHOD')) : strtolower($this->server('REQUEST_METHOD')); } //************************************************************ //* 在代碼的任意處,可以使用logMsg(‘錯誤級別’,’內容’);記錄日志 /*錯誤級別分為:error、info、debug三類 Error:錯誤、在走異常分支的流程時,需要記錄錯誤日志信息 Info:流程信息,可記錄一個流程的輸入至輸出時記錄的流程信息 Debug:調試信息,調試某些功能時,需要記錄參數等內容時,并在功能運行完后比對查看是否符合自己預期時 */ //******************************************************************* /* 操作成功,第一次記錄錯誤會在application目錄下生成CIlogs/日期/Main.log文件 */ ~~~
                  <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>

                              哎呀哎呀视频在线观看