| <?php |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| namespace think; |
|
|
| use think\exception\ClassNotFoundException; |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| class Log |
| { |
| const LOG = 'log'; |
| const ERROR = 'error'; |
| const INFO = 'info'; |
| const SQL = 'sql'; |
| const NOTICE = 'notice'; |
| const ALERT = 'alert'; |
| const DEBUG = 'debug'; |
|
|
| |
| |
| |
| protected static $log = []; |
|
|
| |
| |
| |
| protected static $config = []; |
|
|
| |
| |
| |
| protected static $type = ['log', 'error', 'info', 'sql', 'notice', 'alert', 'debug']; |
|
|
| |
| |
| |
| protected static $driver; |
|
|
| |
| |
| |
| protected static $key; |
|
|
| |
| |
| |
| |
| |
| |
| public static function init($config = []) |
| { |
| $type = isset($config['type']) ? $config['type'] : 'File'; |
| $class = false !== strpos($type, '\\') ? $type : '\\think\\log\\driver\\' . ucwords($type); |
|
|
| self::$config = $config; |
| unset($config['type']); |
|
|
| if (class_exists($class)) { |
| self::$driver = new $class($config); |
| } else { |
| throw new ClassNotFoundException('class not exists:' . $class, $class); |
| } |
|
|
| |
| App::$debug && Log::record('[ LOG ] INIT ' . $type, 'info'); |
| } |
|
|
| |
| |
| |
| |
| |
| |
| public static function getLog($type = '') |
| { |
| return $type ? self::$log[$type] : self::$log; |
| } |
|
|
| |
| |
| |
| |
| |
| |
| |
| public static function record($msg, $type = 'log') |
| { |
| self::$log[$type][] = $msg; |
|
|
| |
| IS_CLI && self::save(); |
| } |
|
|
| |
| |
| |
| |
| |
| public static function clear() |
| { |
| self::$log = []; |
| } |
|
|
| |
| |
| |
| |
| |
| |
| public static function key($key) |
| { |
| self::$key = $key; |
| } |
|
|
| |
| |
| |
| |
| |
| |
| public static function check($config) |
| { |
| return !self::$key || empty($config['allow_key']) || in_array(self::$key, $config['allow_key']); |
| } |
|
|
| |
| |
| |
| |
| |
| public static function save() |
| { |
| |
| if (empty(self::$log)) { |
| return true; |
| } |
|
|
| is_null(self::$driver) && self::init(Config::get('log')); |
|
|
| |
| if (!self::check(self::$config)) { |
| return false; |
| } |
|
|
| if (empty(self::$config['level'])) { |
| |
| $log = self::$log; |
| if (!App::$debug && isset($log['debug'])) { |
| unset($log['debug']); |
| } |
| } else { |
| |
| $log = []; |
| foreach (self::$config['level'] as $level) { |
| if (isset(self::$log[$level])) { |
| $log[$level] = self::$log[$level]; |
| } |
| } |
| } |
|
|
| if ($result = self::$driver->save($log, true)) { |
| self::$log = []; |
| } |
|
|
| Hook::listen('log_write_done', $log); |
|
|
| return $result; |
| } |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| public static function write($msg, $type = 'log', $force = false) |
| { |
| $log = self::$log; |
|
|
| |
| if (true !== $force && !empty(self::$config['level']) && !in_array($type, self::$config['level'])) { |
| return false; |
| } |
|
|
| |
| $log[$type][] = $msg; |
|
|
| |
| Hook::listen('log_write', $log); |
|
|
| is_null(self::$driver) && self::init(Config::get('log')); |
|
|
| |
| if ($result = self::$driver->save($log, false)) { |
| self::$log = []; |
| } |
|
|
| return $result; |
| } |
|
|
| |
| |
| |
| |
| |
| |
| |
| public static function __callStatic($method, $args) |
| { |
| if (in_array($method, self::$type)) { |
| array_push($args, $method); |
|
|
| call_user_func_array('\\think\\Log::record', $args); |
| } |
| } |
|
|
| } |
|
|