Skip to content

Instantly share code, notes, and snippets.

@jorben
Created December 5, 2015 15:42
Show Gist options
  • Save jorben/aae1a88ac6a12b52bfdb to your computer and use it in GitHub Desktop.
Save jorben/aae1a88ac6a12b52bfdb to your computer and use it in GitHub Desktop.
SAE日志类,日志存数据库方便查阅,适用于php,支持同账户下跨应用(多个应用使用同一个db表)
<?php
/*
-- SQL
DROP TABLE IF EXISTS `t_logs`;
CREATE TABLE IF NOT EXISTS `t_logs` (
`f_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`f_level` tinyint(4) NOT NULL,
`f_module` varchar(128) NOT NULL,
`f_time` int(10) unsigned NOT NULL,
`f_path` varchar(256) NOT NULL,
`f_line` int(10) unsigned NOT NULL,
`f_source` varchar(256) NOT NULL,
`f_content` text NOT NULL,
PRIMARY KEY (`f_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='日志表' AUTO_INCREMENT=1 ;
*/
define('CLASS_PLOG_LEVEL_TRACE', 5);
define('CLASS_PLOG_LEVEL_DEBUG', 4);
define('CLASS_PLOG_LEVEL_INFO', 3);
define('CLASS_PLOG_LEVEL_WARNING', 2);
define('CLASS_PLOG_LEVEL_ERROR', 1);
class PLog
{
static $_instance;
private $module;
private $clientIp;
private $reqFile;
private $errCode;
private $errMsg;
private function __construct($module, $reqPath)
{
$this->module = $module;
$this->reqFile = file_exists($reqPath) ? $reqPath : 'Unknow';
$this->clientIp = UtilTool::GetClientIP();
self::$_instance = $this;
}
private function __clone() {}
public static function Init($module='')
{
if( ! (self::$_instance instanceof self) )
{
$stack = debug_backtrace();
$top_call = $stack[0];
$module = strlen($module) ? htmlspecialchars($module, ENT_QUOTES) : basename($top_call['file'], '.php');
$file = $top_call['file'];
self::$_instance = new self($module, $file);
}
return self::$_instance;
}
public function getError()
{
return array('errno'=> self::$_instance->errCode, 'errmsg'=> self::$_instance->errMsg);
}
public static function Trace($content='')
{
return self::write(CLASS_PLOG_LEVEL_TRACE, $content);
}
public static function Debug($content='')
{
return self::write(CLASS_PLOG_LEVEL_DEBUG, $content);
}
public static function Info($content='')
{
return self::write(CLASS_PLOG_LEVEL_INFO, $content);
}
public static function Warning($content='')
{
return self::write(CLASS_PLOG_LEVEL_WARNING, $content);
}
public static function Error($content='')
{
return self::write(CLASS_PLOG_LEVEL_ERROR, $content);
}
private function clearErr()
{
self::$_instance->errCode = 0;
self::$_instance->errMsg = '';
return 0;
}
private function write($level, $content)
{
self::clearErr();
$stack = debug_backtrace();
$line = (isset($stack[1]) && isset($stack[1]['line'])) ? $stack[1]['line'] : 0;
if (is_array($content) || is_object($content)) $content = json_encode($content);
$content = is_string($content) ? htmlspecialchars($content, ENT_QUOTES) : $content;
$db = new SaeMysql();
// 跨应用
if(defined('PLOG_DOMAIN_ID') && PLOG_DOMAIN_ID)
{
$db->setAppname(PLOG_DOMAIN_APP);
$db->setAuth(PLOG_DOMAIN_ID, PLOG_DOMAIN_KEY);
}
$sql = 'INSERT INTO `t_logs` (`f_level`, `f_module`, `f_time`, `f_path`, `f_line`, `f_source`, `f_content`) VALUES('.
$level. ', \''.self::$_instance->module.'\', '. time() . ', \'' .self::$_instance->reqFile.'\', '.$line.', \''. self::$_instance->clientIp . '\', \''. $content .'\')';
// echo $sql; exit();
$ret = $db->run_sql($sql);
if (0 == $db->errno())
{
return $ret;
}
self::$_instance->errCode = $db->errno();
self::$_instance->errMsg = 'mysql error:'. $db->error();
return false;
}
}
@jorben
Copy link
Author

jorben commented Dec 5, 2015

用到的 UtilTool::GetClientIP() 的实现:

<?php
class UtilTool
{
    public static function GetClientIP()
    {
        $ip = '0.0.0.0';
        if (getenv("HTTP_CLIENT_IP"))
            $ip = getenv("HTTP_CLIENT_IP");
        else if(getenv("HTTP_X_FORWARDED_FOR"))
            $ip = getenv("HTTP_X_FORWARDED_FOR");
        else if(getenv("REMOTE_ADDR"))
            $ip = getenv("REMOTE_ADDR");

        $tpl = '/^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$/';

        if (preg_match($tpl, $ip) === 1)
            return $ip;
        return '0.0.0.0';
    }
}

PLog使用方法:

<?php
// test.php
require('PLog.class.php');
// init plog 
PLog::Init();

// some code...
// need log than:
PLog::Error('some error msg...');
// some code..
PLog:: Debug('some debug msg...');

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment