锁定老帖子 主题:写个日志封装器....感觉用起来很爽
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2011-04-15
写个日志封装器.... <?php /** * 日志系统抽象类 * */ abstract class LogWriterAbstract { /** * 是否启用日志记录 * * @var boolean */ protected $_enabled = true; abstract function append($msg, $title = '', $level = 'info'); } /** * LogFirePHPWriter 类提供对 FirePHP 的支持 */ class LogFirePHPWriter extends LogWriterAbstract { /** * FirePHP 具体实现对象 * * @var FirePHP */ private $_kernel; function __construct(){ $this->_enabled = App::ini('_log_enabled',true); if (!$this->_enabled) return; require_once 'FirePHP.class.php'; $this->_kernel = FirePHP::getInstance(true); } function append($msg, $title = '', $level = 'info'){ if ($this->_enabled) $this->_kernel->fb($msg, $title, FirePHP::INFO); } } /** * LogFile 类提供基本的文件日志服务 */ class LogFileWriter extends LogWriterAbstract { /** * 保存运行期间的日志 * * @var string */ private $_log = ''; /** * 日期格式 * * @var string */ private $dateFormat = 'Y-m-d H:i:s'; /** * 保存日志文件的目录 * * @var string */ private $_logFileDir; /** * 保存日志的文件名 * * @var string */ private $_logFilename; /** * 要写入日志文件的错误级别 * * @var array */ private $_errorLevel; /** * 构造函数 */ function __construct() { $this->_enabled = App::ini('_log_enabled',true); if (!$this->_enabled) return; $dir = App::ini('_log_file_dir',null); if (empty($dir)){ $this->_enabled = false; return; } $dir = realpath($dir); if (substr($dir, -1) != DS) { $dir .= DS; } if (!is_dir($dir) || !is_writable($dir)) { $this->_enabled = false; } else { $this->_logFileDir = $dir; $this->_logFilename = $this->_logFileDir . App::ini('_log_filename','access.log'); $errorLevel = explode(',', strtolower(App::ini('_log_levels','notice, debug, warning, error, exception, info'))); $errorLevel = array_map('trim', $errorLevel); $errorLevel = array_filter($errorLevel, 'trim'); $this->_errorLevel = array(); foreach ($errorLevel as $e) { $this->_errorLevel[$e] = true; } global $___sfw_loaded_time; $sec = (int) $___sfw_loaded_time; $usec = $___sfw_loaded_time - $sec; $this->_startTag = sprintf("[%s %s] ======= SFW Loaded =======\n", date($this->dateFormat, $sec), $usec); if (isset($_SERVER['REQUEST_URI'])) { $this->_startTag .= sprintf("[%s] REQUEST_URI: %s\n", date($this->dateFormat), $_SERVER['REQUEST_URI']); } // 注册脚本结束时要运行的方法,将缓存的日志内容写入文件 ShutdownCallback::getInstance()->add(array($this, '__writeLog')); // 检查文件是否已经超过指定大小 if (file_exists($this->_logFilename)) { $filesize = filesize($this->_logFilename); } else { $filesize = 0; } $maxsize = (int)App::ini('_log_file_maxsize',512); if ($maxsize >= 512) { $maxsize = $maxsize * 1024; if ($filesize >= $maxsize) { // 使用新的日志文件名 $pathinfo = pathinfo($this->_logFilename); $newFilename = $pathinfo['dirname'] . DS . basename($pathinfo['basename'], '.' . $pathinfo['extension']) . date('-Ymd-His') . '.' . $pathinfo['extension']; rename($this->_logFilename, $newFilename); } } } } /** * 追加日志信息 * * @param string $msg * @param string $title * @param string $level */ function append($msg, $title = '', $level = 'info') { if ($this->_enabled && isset($this->_errorLevel[strtolower($level)])){ $this->_log .= sprintf("[%s] [%s] %s:%s\n", date($this->dateFormat), $level, $title, print_r($msg, true)); } } /** * 将缓存的日志信息写入实际存储,并清空缓存 * 此方法由系统自动调用 * */ function __writeLog(){ if (!$this->_enabled) return; if (empty($this->_log)) return; global $___sfw_loaded_time; $shutdown_time = microtime(true); $sec = (int) $shutdown_time; $usec = $shutdown_time - $sec; $elapsedTime = $shutdown_time - $___sfw_loaded_time; $content = $this->_startTag . $this->_log . sprintf("[%s %s] ======= SFW End (elapsed: %f seconds) =======\n\n",date($this->dateFormat, $sec), $usec, $elapsedTime); $fp = fopen($this->_logFilename, 'a'); if (!$fp) { return; } flock($fp, LOCK_EX); fwrite($fp, str_replace("\r", '', $content)); flock($fp, LOCK_UN); fclose($fp); } }
<?php /** * 应用程序基本启动文件,提供应用程序运行的关键设置信息 */ $root_dir = dirname(dirname(dirname(__FILE__))); /** * 如果要集成第三方的 PHP 库,错误报告也许要修改为: * * error_reporting(E_ALL & ~(E_STRICT | E_NOTICE)); */ error_reporting(E_ALL | E_STRICT); $config = array( /** * 应用程序的 ID,用于唯一标识一个应用程序 */ 'APPID' => 'todo', /** * 应用程序根目录 */ 'ROOT_DIR' => $root_dir, /** * 主程序所在目录 */ 'APP_DIR' => "{$root_dir}/_code/app", /** * 辅助库目录 */ 'LIBRARY_DIR' => "{$root_dir}/_code/lib", /** * 配置文件所在目录 */ 'CONFIG_DIR' => "{$root_dir}/_code/config", /** * 临时(缓存)文件所在目录 */ 'TMP_DIR' => "{$root_dir}/_code/tmp", /** * 日志文件所在目录 */ 'LOG_DIR' => "{$root_dir}/_code/log", /** * 所有扩展模块所在的目录 */ 'MODULE_DIR' => "{$root_dir}/_code/app/modules", ); // 设置类文件基本路径 //set_include_path('.' . PATH_SEPARATOR . $config['LIBRARY_DIR'] . PATH_SEPARATOR . get_include_path()); require_once("{$config['LIBRARY_DIR']}/app.php"); App::replaceIni($config); // 加载不同命名空间下的配置文件 {namespace}.sys.php,{namespace}.route.php $configForNamepace = array( /** * 国际化和本地化 */ '_i18n_multi_languages' => false,// 指示是否启用多语言支持 '_l10n_default_timezone' => 'Asia/Shanghai',// 默认的时区设置 /** * 日志设置 */ '_log_enabled' => true , '_log_writer' => 'LogFileWriter' , //LogFirePHPWriter '_log_file_dir' => App::ini('LOG_DIR'), '_log_filename' => "{$namespace}-access.log" , '_log_file_maxsize' => 512 , '_log_levels' => 'notice, debug, warning, error, exception, info' , /** * 数据库链接DSN设置 */ '_db_default_dsn' => array( 'driver' => 'mysqlt', 'host' => 'localhost', 'login' => 'root', 'password' => 'root', 'database' => 'smallcms', 'charset' => 'utf8', ), ); App::replaceIni($configForNamepace); /** * 初始化应用程序 */ // 设置默认的时区 date_default_timezone_set(App::ini('_i10n_default_timezone','Asia/Shanghai')); // 设置应用的日志记录服务 require_once("{$config['LIBRARY_DIR']}/log.php"); App::$_log_ = App::singleton(App::ini('_log_writer')); // 设置应用的缓存服务 // 加载数据库操作组件 require_once("{$config['LIBRARY_DIR']}/db.php"); // 设置分发器对象,并进行请求分发 require_once("{$config['LIBRARY_DIR']}/web.php"); $wd = WebDispatcher::getInstance(); $wd->setNamespace($namespace); // 设置过滤器 //$wd->addBeforeFilter(new RequestAuthFilter()); $response = $wd->dispatching(); if ($response) echo $response; 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2011-04-15
/** * 缓存组件抽象类 * */ abstract class CacheWriterAbstract { /** * 写入缓存 * * @param string $id * @param mixed $data * @param array $policy */ abstract function set($id, $data, array $policy = null); /** * 读取缓存,失败或缓存撒失效时返回 false * * @param string $id * @param array $policy * * @return mixed */ abstract function get($id, array $policy = null); /** * 删除指定的缓存 * * @param string $id * @param array $policy */ abstract function remove($id, array $policy = null); } |
|
返回顶楼 | |
发表时间:2011-04-17
更新后的版本:
<?php /** * 日志系统抽象类 * */ abstract class LogWriterAbstract { /** * 是否启用日志记录 * * @var boolean */ protected $_enabled = true; /** * 日志记录的错误级别 * * @var array */ protected $_errorLevel = array( 'notice' => false, 'debug' => false, 'warning' => false, 'error' => false, 'exception' => false, 'info' => false, ); abstract function append($msg, $title = '', $level = 'info'); } /** * LogFirePHPWriter 类提供对 FirePHP 的支持 */ class LogFirePHPWriter extends LogWriterAbstract { function __construct(){ $this->_enabled = App::ini('_log/enabled',true); if (!$this->_enabled) return; $errorLevel = normalize(strtolower(App::ini('_log/levels','exception,error')),','); if (!empty($errorLevel)) foreach ($errorLevel as $e) $this->_errorLevel[$e] = true; } function append($msg, $title = '', $level = 'info'){ $level = strtolower(trim($level)); if ($this->_enabled && isset($this->_errorLevel[$level])){ switch($level){ case 'info': case 'debug': FirePhpHelper::getInstance()->info($msg, $title); break; case 'notice': FirePhpHelper::getInstance()->log($msg, $title); break; case 'exception': FirePhpHelper::getInstance()->warn($msg, $title); break; case 'error': FirePhpHelper::getInstance()->error($msg, $title); break; } } } } /** * LogFile 类提供基本的文件日志服务 */ class LogFileWriter extends LogWriterAbstract { /** * 保存运行期间的日志 * * @var string */ private $_log = ''; /** * 日期格式 * * @var string */ private $dateFormat = 'Y-m-d H:i:s'; /** * 保存日志文件的目录 * * @var string */ private $_logFileDir; /** * 保存日志的文件名 * * @var string */ private $_logFilename; /** * 构造函数 */ function __construct() { $this->_enabled = App::ini('_log/enabled',true); if (!$this->_enabled) return; $dir = App::ini('_log/file_dir',null); if (empty($dir)){ $this->_enabled = false; return; } $dir = realpath($dir); if (substr($dir, -1) != DS) { $dir .= DS; } if (!is_dir($dir) || !is_writable($dir)) { $this->_enabled = false; } else { $this->_logFileDir = $dir; $this->_logFilename = $this->_logFileDir . App::ini('_log/filename','access.log'); $errorLevel = normalize(strtolower(App::ini('_log/levels','exception,error')),','); if (!empty($errorLevel)){ foreach ($errorLevel as $e){ if (isset($this->_errorLevel[$e])) $this->_errorLevel[$e] = true; } } global $___sfw_loaded_time; $sec = (int) $___sfw_loaded_time; $usec = $___sfw_loaded_time - $sec; $this->_startTag = sprintf("[%s %s] ======= SFW Loaded =======\n", date($this->dateFormat, $sec), $usec); if (isset($_SERVER['REQUEST_URI'])) { $this->_startTag .= sprintf("[%s] REQUEST_URI: %s\n", date($this->dateFormat), $_SERVER['REQUEST_URI']); } // 注册脚本结束时要运行的方法,将缓存的日志内容写入文件 ShutdownCallback::getInstance()->add(array($this, '__writeLog')); // 检查文件是否已经超过指定大小 if (file_exists($this->_logFilename)) { $filesize = filesize($this->_logFilename); } else { $filesize = 0; } $maxsize = (int)App::ini('_log/file_maxsize',512); if ($maxsize >= 512) { $maxsize = $maxsize * 1024; if ($filesize >= $maxsize) { // 使用新的日志文件名 $pathinfo = pathinfo($this->_logFilename); $newFilename = $pathinfo['dirname'] . DS . basename($pathinfo['basename'], '.' . $pathinfo['extension']) . date('-Ymd-His') . '.' . $pathinfo['extension']; rename($this->_logFilename, $newFilename); } } } } /** * 追加日志信息 * * @param string $msg * @param string $title * @param string $level */ function append($msg, $title = '', $level = 'info') { if ($this->_enabled && isset($this->_errorLevel[strtolower($level)])){ $this->_log .= sprintf("[%s] [%s] %s:%s\n", date($this->dateFormat), $level, $title, print_r($msg, true)); } } /** * 将缓存的日志信息写入实际存储,并清空缓存 * 此方法由系统自动调用 * */ function __writeLog(){ if (!$this->_enabled) return; if (empty($this->_log)) return; global $___sfw_loaded_time; $shutdown_time = microtime(true); $sec = (int) $shutdown_time; $usec = $shutdown_time - $sec; $elapsedTime = $shutdown_time - $___sfw_loaded_time; $content = $this->_startTag . $this->_log . sprintf("[%s %s] ======= SFW End (elapsed: %f seconds) =======\n\n",date($this->dateFormat, $sec), $usec, $elapsedTime); $fp = fopen($this->_logFilename, 'a'); if (!$fp) { return; } flock($fp, LOCK_EX); fwrite($fp, str_replace("\r", '', $content)); flock($fp, LOCK_UN); fclose($fp); } } |
|
返回顶楼 | |
发表时间:2011-05-03
建议顺便发个demo给我们下载,嘿嘿
|
|
返回顶楼 | |
发表时间:2011-05-03
发了 在 sfw最初版本里面 那个页面上 你看看 应该在首页上
|
|
返回顶楼 | |
发表时间:2011-05-05
嘿~~排版不错。下啦。
|
|
返回顶楼 | |
发表时间:2011-05-05
LZ邪恶的变量命名
|
|
返回顶楼 | |
发表时间:2011-05-05
1927105 写道 LZ邪恶的变量命名 支持楼主 |
|
返回顶楼 | |
发表时间:2011-05-11
PHP 恶心的变量名字 看的我头疼
|
|
返回顶楼 | |
发表时间:2011-05-30
上面的代码经过测试有问题,不能自定义日志级别的输出 汗死 犯了很低级的错误 ,在 append 方法里面
原来是 校验 两个条件 $this->_enabled && isset($this->_errorLevel[$level]) 更正后 $this->_enabled && isset($this->_errorLevel[$level]) && $this->_errorLevel[$level] 应该加上 $this->_errorLevel[$level] 这个值的校验,缺省就是false 所以 isset肯定是true ,.... .... |
|
返回顶楼 | |