|
@@ -1,4 +1,5 @@
|
|
|
<?php
|
|
|
+
|
|
|
/**
|
|
|
* 记录日志
|
|
|
***/
|
|
@@ -22,7 +23,6 @@ class scope_trace
|
|
|
|
|
|
class Log
|
|
|
{
|
|
|
- const open_sql = true;
|
|
|
const SQL = 1;
|
|
|
const INFO = 2;
|
|
|
const DEBUG = 3;
|
|
@@ -30,21 +30,60 @@ class Log
|
|
|
const ERR = 5;
|
|
|
const RUN = 6;
|
|
|
const WAIT_HANDLE = 10;
|
|
|
- const cur_level = self::DEBUG;
|
|
|
|
|
|
- private static $log = [];
|
|
|
+ private $mSqlog;
|
|
|
+
|
|
|
+ private $mAppFileName;
|
|
|
+ private $mAppFile;
|
|
|
+
|
|
|
+ private $mOpenAll;
|
|
|
+ private $mAllFileName;
|
|
|
+ private $mAllFile;
|
|
|
+
|
|
|
+ private $mCurLevel;
|
|
|
+ private $mOpenSql;
|
|
|
+
|
|
|
+ private $mPathFileName;
|
|
|
+ private $mPathFile;
|
|
|
+
|
|
|
+ private static $stInstance = null;
|
|
|
+ private function __construct()
|
|
|
+ {
|
|
|
+ $this->mSqlog = false;
|
|
|
+
|
|
|
+ $this->mAppFile = false;
|
|
|
+ $this->mAppFileName = '';
|
|
|
|
|
|
- private static $sqlog = false;
|
|
|
+ $this->mOpenAll = true;
|
|
|
+ $this->mAllFile = false;
|
|
|
+ $this->mAllFileName = '';
|
|
|
+
|
|
|
+ $this->mCurLevel = self::DEBUG;
|
|
|
+ $this->mOpenSql = true;
|
|
|
+
|
|
|
+ $this->mPathFileName = '';
|
|
|
+ $this->mPathFile = false;
|
|
|
+ }
|
|
|
+
|
|
|
+ public static function instance()
|
|
|
+ {
|
|
|
+ if (self::$stInstance == null) {
|
|
|
+ self::$stInstance = new Log();
|
|
|
+ }
|
|
|
+ return self::$stInstance;
|
|
|
+ }
|
|
|
|
|
|
public static function start_sql_log()
|
|
|
{
|
|
|
- self::$sqlog = [];
|
|
|
+ $pThis = self::instance();
|
|
|
+ $pThis->mSqlog = [];
|
|
|
}
|
|
|
|
|
|
public static function sql_log()
|
|
|
{
|
|
|
- if (is_array(self::$sqlog)) {
|
|
|
- return self::$sqlog;
|
|
|
+ $pThis = self::instance();
|
|
|
+ if (is_array($pThis->mSqlog)) {
|
|
|
+ return $pThis->mSqlog;
|
|
|
} else {
|
|
|
return [];
|
|
|
}
|
|
@@ -52,74 +91,58 @@ class Log
|
|
|
|
|
|
public static function end_sql_log()
|
|
|
{
|
|
|
- self::$sqlog = false;
|
|
|
+ $pThis = self::instance();
|
|
|
+ $pThis->mSqlog = [];
|
|
|
}
|
|
|
|
|
|
private static function add_sql_log($log)
|
|
|
{
|
|
|
- if (is_array(self::$sqlog)) {
|
|
|
- self::$sqlog[] = $log;
|
|
|
+ $pThis = self::instance();
|
|
|
+ if (is_array($pThis->mSqlog)) {
|
|
|
+ $pThis->mSqlog[] = $log;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
- static private $cur_path_file_name = '';
|
|
|
- static private $cur_path_file;
|
|
|
-
|
|
|
- public static function record_path($content)
|
|
|
+ public static function record($message, $lev = self::ERR)
|
|
|
{
|
|
|
- $path_file = BASE_DATA_PATH . '/log/' . date('Ymd', time()) . '_path.log';
|
|
|
- if (self::$cur_path_file_name != $path_file) {
|
|
|
- if (self::$cur_path_file != null) {
|
|
|
- fclose(self::$cur_path_file);
|
|
|
- }
|
|
|
- self::$cur_path_file = fopen($path_file, 'a');
|
|
|
- }
|
|
|
-
|
|
|
- if (@flock(self::$cur_path_file, LOCK_EX)) {
|
|
|
- fwrite(self::$cur_path_file, $content);
|
|
|
- fwrite(self::$cur_path_file, "\r\n");
|
|
|
- @flock(self::$cur_path_file, LOCK_UN);
|
|
|
- }
|
|
|
+ self::instance()->doRecord($message, $lev);
|
|
|
}
|
|
|
|
|
|
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
-
|
|
|
- public static function record($message, $lev = self::ERR)
|
|
|
+ private function doRecord($message, $lev = self::ERR)
|
|
|
{
|
|
|
- $now = date('Y-m-d H:i:s', time());
|
|
|
- $pid = posix_getpid();
|
|
|
+ $slevel = $this->get_level($lev);
|
|
|
+ $content = $this->format_msg($message,$slevel);
|
|
|
|
|
|
- if ($lev == self::WAIT_HANDLE) {
|
|
|
- $level = 'WAIT_HANDLE';
|
|
|
- $log_file = BASE_DATA_PATH . '/log/' . date('Ymd', time()) . '-wait.log';
|
|
|
- $content = "[{$pid} {$now}] {$level}: {$message}\r\n";
|
|
|
- file_put_contents($log_file, $content, FILE_APPEND);
|
|
|
- return;
|
|
|
+ if ($lev == self::SQL && $this->mOpenSql) {
|
|
|
+ $this->write($content);
|
|
|
+ if($this->mOpenAll) $this->write_all($content);
|
|
|
}
|
|
|
-
|
|
|
- if ($lev == self::SQL) {
|
|
|
- $level = 'SQL';
|
|
|
- if (self::open_sql) {
|
|
|
- self::write($message, $level);
|
|
|
- }
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- if ($lev >= self::cur_level && $lev <= self::RUN) {
|
|
|
- $level = self::get_level($lev);
|
|
|
- self::write($message, $level);
|
|
|
+ elseif ($lev >= $this->mCurLevel && $lev <= self::RUN) {
|
|
|
+ $this->write($content);
|
|
|
+ if($this->mOpenAll) $this->write_all($content);
|
|
|
}
|
|
|
|
|
|
if ($lev == self::ERR) {
|
|
|
- self::msg();
|
|
|
+ $msg = $this->msg();
|
|
|
+ $content = $this->format_msg($msg,$slevel);
|
|
|
+ $this->write($content);
|
|
|
+ if($this->mOpenAll) $this->write_all($content);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- private static $cur_file_name;
|
|
|
- private static $cur_file = null;
|
|
|
+ private function get_level($lev)
|
|
|
+ {
|
|
|
+ if ($lev == self::SQL) return 'SQL';
|
|
|
+ if ($lev == self::INFO) return 'INFO';
|
|
|
+ if ($lev == self::DEBUG) return 'DEBUG';
|
|
|
+ if ($lev == self::WARING) return 'WARING';
|
|
|
+ if ($lev == self::ERR) return 'ERR';
|
|
|
+ if ($lev == self::RUN) return 'RUN';
|
|
|
+ return 'Unknown';
|
|
|
+ }
|
|
|
|
|
|
- private static function write($message, $level)
|
|
|
+ private function format_msg($message,$level)
|
|
|
{
|
|
|
$now = @date('Y-m-d H:i:s', time());
|
|
|
if(defined('USE_COROUTINE') && USE_COROUTINE === true) {
|
|
@@ -132,51 +155,59 @@ class Log
|
|
|
$pid = posix_getpid();
|
|
|
}
|
|
|
|
|
|
-
|
|
|
$appid = empty(APP_ID) ? '' : APP_ID;
|
|
|
+ $content = "[{$appid} {$pid} {$now}] {$level}: {$message}\r\n";
|
|
|
+ return $content;
|
|
|
+ }
|
|
|
|
|
|
+ private function write($content)
|
|
|
+ {
|
|
|
+ $appid = empty(APP_ID) ? '' : APP_ID;
|
|
|
$log_file = BASE_DATA_PATH . '/log/' . date('Ymd', time()) . '-' . $appid . '.log';
|
|
|
- if (self::$cur_file_name != $log_file) {
|
|
|
- if (self::$cur_file != null) {
|
|
|
- fclose(self::$cur_file);
|
|
|
+
|
|
|
+ if ($this->mAppFileName != $log_file)
|
|
|
+ {
|
|
|
+ if ($this->mAppFile !== false) {
|
|
|
+ fclose($this->mAppFile);
|
|
|
}
|
|
|
- self::$cur_file_name = $log_file;
|
|
|
- self::$cur_file = fopen($log_file, 'a+');
|
|
|
+
|
|
|
+ $this->mAppFileName = $log_file;
|
|
|
+ $this->mAppFile = fopen($log_file, 'a+');
|
|
|
}
|
|
|
|
|
|
- $content = "[{$pid} {$now}] {$level}: {$message}\r\n";
|
|
|
- $ret = fwrite(self::$cur_file, $content);
|
|
|
- if ($ret === false) {
|
|
|
- self::$cur_file = fopen($log_file, 'a+');
|
|
|
- fwrite(self::$cur_file, $content);
|
|
|
+ if ($this->mAppFile !== false) {
|
|
|
+ fwrite($this->mAppFile, $content);
|
|
|
+ fflush($this->mAppFile);
|
|
|
}
|
|
|
- fflush(self::$cur_file);
|
|
|
}
|
|
|
|
|
|
- public static function endl($lev = self::ERR)
|
|
|
+ private function write_all($content)
|
|
|
{
|
|
|
- $content = "\r\n";
|
|
|
+ $log_file = BASE_DATA_PATH . '/log/' . date('Ymd', time()) . '.log';
|
|
|
+
|
|
|
+ if ($this->mAllFileName != $log_file)
|
|
|
+ {
|
|
|
+ if ($this->mAllFile !== false) {
|
|
|
+ fclose($this->mAllFile);
|
|
|
+ }
|
|
|
|
|
|
- if ($lev == self::SQL && self::open_sql) {
|
|
|
- $log_file = BASE_DATA_PATH . '/log/' . date('Ymd', time()) . '.log';
|
|
|
- file_put_contents($log_file, $content, FILE_APPEND);
|
|
|
- return;
|
|
|
+ $this->mAllFileName = $log_file;
|
|
|
+ $this->mAllFile = fopen($log_file, 'a+');
|
|
|
}
|
|
|
|
|
|
- if ($lev >= self::cur_level) {
|
|
|
- $log_file = BASE_DATA_PATH . '/log/' . date('Ymd', time()) . '.log';
|
|
|
- file_put_contents($log_file, $content, FILE_APPEND);
|
|
|
+ if ($this->mAllFile !== false) {
|
|
|
+ fwrite($this->mAllFile, $content);
|
|
|
+ fflush($this->mAllFile);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- public static function msg()
|
|
|
+ private function msg()
|
|
|
{
|
|
|
$debugInfo = debug_backtrace();
|
|
|
-
|
|
|
- $stack = "[";
|
|
|
+ $stack = "\t[";
|
|
|
foreach ($debugInfo as $key => $val) {
|
|
|
if (array_key_exists("file", $val)) {
|
|
|
- $stack .= ",file:" . $val["file"];
|
|
|
+ $stack .= "\tfile:" . $val["file"];
|
|
|
}
|
|
|
if (array_key_exists("line", $val)) {
|
|
|
$stack .= ",line:" . $val["line"];
|
|
@@ -184,24 +215,38 @@ class Log
|
|
|
if (array_key_exists("function", $val)) {
|
|
|
$stack .= ",function:" . $val["function"];
|
|
|
}
|
|
|
+ $stack .= "\r\n";
|
|
|
}
|
|
|
$stack .= "]";
|
|
|
|
|
|
return $stack;
|
|
|
}
|
|
|
|
|
|
- private static function get_level($lev)
|
|
|
+ private function doRecordPath($content)
|
|
|
{
|
|
|
- if ($lev == self::INFO) return 'INFO';
|
|
|
- if ($lev == self::DEBUG) return 'DEBUG';
|
|
|
- if ($lev == self::WARING) return 'WARING';
|
|
|
- if ($lev == self::ERR) return 'ERR';
|
|
|
- if ($lev == self::RUN) return 'RUN';
|
|
|
- return 'Unknown';
|
|
|
+ $path_file = BASE_DATA_PATH . '/log/' . date('Ymd', time()) . '_path.log';
|
|
|
+ if ($this->mPathFileName != $path_file)
|
|
|
+ {
|
|
|
+ if ($this->mPathFile !== false) {
|
|
|
+ fclose($this->mPathFile);
|
|
|
+ }
|
|
|
+
|
|
|
+ $this->mPathFile = fopen($path_file, 'a');
|
|
|
+ }
|
|
|
+
|
|
|
+ if($this->mPathFile !== false)
|
|
|
+ {
|
|
|
+ if (@flock($this->mPathFile, LOCK_EX)) {
|
|
|
+ fwrite($this->mPathFile, $content);
|
|
|
+ fwrite($this->mPathFile, "\r\n");
|
|
|
+ @flock($this->mPathFile, LOCK_UN);
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
- public static function read()
|
|
|
+ public static function record_path($content)
|
|
|
{
|
|
|
- return self::$log;
|
|
|
+ $pThis = self::instance();
|
|
|
+ $pThis->doRecordPath($content);
|
|
|
}
|
|
|
}
|