写个日志封装器....
<?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;