基于codeigniter框架写的网站日志系统适配器(支持写入本地文件、数据库、远程服务器)

下图为文件结构:

核心为件为ShinowLog.php,以下为该文件代码

<?php

defined('BASEPATH') OR exit('No direct script access allowed');

/**
 * ShinowCMS日志系统
 * 采用驱动配置的调用模式,日志写入模式包括文件、数据库、远程写入三种
 * @author  LIUTAO  2016/1/19
 */
class ShinowLog extends CI_Driver_Library {

    /**
     * 验证驱动类型属性
     */
    protected $valid_drivers = array('file', 'db', 'remote');

    /**
     * 默认适配器名称
     */
    protected $_adapter = 'file';

    /**
     * 日志前缀索引,用于区别不同站点日志
     */
    public $key_prefix = DOMAIN;
    
    /**
     * 存储配置文件中内容
     * @var type ARRAY
     */   
    protected $cfg = array();
    /**
     * 日志构造器
     * 根据配置文件初始化成员变量
     */
    public function __construct($config = array()) {
         $this->cfg = &get_shinowlog();
        if (isset($config['adapter']) && in_array($config['adapter'], $this->valid_drivers)) {
            $this->_adapter = $config['adapter'];
        } else {          
            if (isset($this->cfg['shinowlog_adapter']) && in_array($this->cfg['shinowlog_adapter'], $this->valid_drivers)) {
                $this->_adapter = $this->cfg['shinowlog_adapter'];
            } else {
                throw new Exception('非法的适配器!');
            }
        }
    }
    /**
     * 
     * @param type $level
     * @param type $msg
     * @param type $runtime
     * @return boolean
     * @comment 写入日志统一入口
     */
    public function write_log($level, $msg, $runtime = null) {
        
        if($this->_is_needed($level)){
            if($this->_adapter!="file"){
                $return_msg = $this->{$this->_adapter}->write_log($level, $msg, $runtime);
                if($return_msg!="ok"){
                    $this->_adapter = 'file';
                    $this->{$this->_adapter}->write_log($level, $msg, $runtime);
                }
                return true;
            }else{
                 $return_msg = $this->{$this->_adapter}->write_log($level, $msg, $runtime);
            }
        } else {
            return false;
        }      
    }
    /**
     * 根据配置文件判断是否需要写入日志
     */
    private function _is_needed($level){
       // print_r($this->cfg);
        $level = strtoupper($level);
        if(isset($this->cfg['shinowlog_threshold']) && isset($this->cfg['levels'])){
            //echo "aaa";
            if(is_array($this->cfg['shinowlog_threshold'])){
                $diff = array_diff($this->cfg['shinowlog_threshold'],$this->cfg['levels']);
                if(empty($diff)){
                    if(in_array($this->cfg['levels'][$level],$this->cfg['levels'])&& in_array($this->cfg['levels'][$level],$this->cfg['shinowlog_threshold'])){
                        return true;
                    }else {
                        return false;
                    }
                }else {
                    return false;
                }
            }else {
               // var_dump($level == $this->cfg['levels'][$level]);
                if($this->cfg['shinowlog_threshold']==$this->cfg['levels']['ALL']){
                    return true;
                }else if(in_array($this->cfg['shinowlog_threshold'],$this->cfg['levels'])){
                    return true;
                }else {
                    return false;
                }
            }
        }else {
            return false;
        }
        
    }

}

这是适配器drivers文件

<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/* *
 * ShinowLog文件日志适配器
 */
class CI_ShinowLog_file extends CI_Driver {
    

	/**
	 * 保存日志的路径
	 *
	 * @var string
	 */
	protected $_shinowlog_path;

	/**
	 * 日志文件权限
	 *
	 * @var	int
	 */
	protected $_file_permissions = 0644;

	/**
	 * 日志级别
	 *
	 * @var int
	 */
	protected $_threshold = 5;

	/**
	 * 日志级别数组
	 *
	 * @var array
	 */
	protected $_threshold_array = array();

	/**
	 * 文件日志保存的时间格式
	 *
	 * @var string
	 */
	protected $_date_fmt = 'Y-m-d H:i:s';

	/**
	 * 文件方扩展名
	 *
	 * @var	string
	 */
	protected $_file_ext;

	/**
	 * 是否确定写入日志,主要依赖于所配置的日志级别
	 *
	 * @var bool
	 */
	protected $_enabled = TRUE;

	/**
	 * 日志级别信息
	 *
	 * @var array
	 */
	protected $_levels = null;
        
        /**
         * 服务器编号
         * 注:如果值为null,则写入日志时,值不可见
         */
        protected  $_serverID = 'NULL';
        // --------------------------------------------------------------------

	/**
	 *类的初始化
	 *
	 * @return	void
	 */
	public function __construct()
	{
		$config =& get_shinowlog();
                $this->_levels = $config['levels'];
		$this->_shinowlog_path = ($config['shinowlog_path'] !== '') ? $config['shinowlog_path'] : APPPATH.'logs/';
                $this->_serverID = isset($config['server_id'])?$config['server_id']:'NULL';
		$this->_file_ext = (isset($config['shinowlog_file_extension']) && $config['shinowlog_file_extension'] !== '')
			? ltrim($config['shinowlog_file_extension'], '.') : 'php';

		file_exists($this->_shinowlog_path) OR mkdir($this->_shinowlog_path, 0755, TRUE);

		if ( ! is_dir($this->_shinowlog_path) OR ! is_really_writable($this->_shinowlog_path))
		{
			$this->_enabled = FALSE;
		}

		if (is_numeric($config['shinowlog_threshold']))
		{
			$this->_threshold = (int) $config['shinowlog_threshold'];
		}
		elseif (is_array($config['shinowlog_threshold']))
		{
			$this->_threshold = 0;
			$this->_threshold_array = array_flip($config['shinowlog_threshold']);
		}

		if ( ! empty($config['shinowlog_date_format']))
		{
			$this->_date_fmt = $config['shinowlog_date_format'];
		}

		if ( ! empty($config['shinowlog_file_permissions']) && is_int($config['shinowlog_file_permissions']))
		{
			$this->_file_permissions = $config['shinowlog_file_permissions'];
		}
	}

	// --------------------------------------------------------------------

	/**
	 * 日志写入
	 *
	 * 一般情况下日志会在全局函数shinowlog_message()中调用
	 *
	 * @return	bool
	 */
	public function write_log($level, $msg,$runtime=null)
	{
		if ($this->_enabled === FALSE)
		{
			return FALSE;
		}

		$level = strtoupper($level);

		if (( ! isset($this->_levels[$level]) OR ($this->_levels[$level] > $this->_threshold))
			&& ! isset($this->_threshold_array[$this->_levels[$level]]))
		{
			return FALSE;
		}

		$filepath = $this->_shinowlog_path.'sys-'.date('Y-m-d').'.'.$this->_file_ext;
		$message = '';

		if ( ! file_exists($filepath))
		{
			$newfile = TRUE;
			// Only add protection to php files
			if ($this->_file_ext === 'php')
			{
				$message .= "<?php defined('BASEPATH') OR exit('No direct script access allowed'); ?>\n\n";
			}
		}

		if ( ! $fp = @fopen($filepath, 'ab'))
		{
			return FALSE;
		}

		// Instantiating DateTime with microseconds appended to initial date is needed for proper support of this format
		if (strpos($this->_date_fmt, 'u') !== FALSE)
		{
			$microtime_full = microtime(TRUE);
			$microtime_short = sprintf("%06d", ($microtime_full - floor($microtime_full)) * 1000000);
			$date = new DateTime(date('Y-m-d H:i:s.'.$microtime_short, $microtime_full));
			$date = $date->format($this->_date_fmt);
		}
		else
		{
			$date = date($this->_date_fmt);
		}
                $runtime = $runtime==null?'NULL':$runtime;
		$message .= DOMAIN.'|'.$this->_serverID.'|'.$level.' | '.APPURI.'|'.REFERER.'|'.$runtime.'|'.$date.' --> '.$msg."\n";

		flock($fp, LOCK_EX);

		for ($written = 0, $length = strlen($message); $written < $length; $written += $result)
		{
			if (($result = fwrite($fp, substr($message, $written))) === FALSE)
			{
				break;
			}
		}

		flock($fp, LOCK_UN);
		fclose($fp);

		if (isset($newfile) && $newfile === TRUE)
		{
			chmod($filepath, $this->_file_permissions);
		}

		return is_int($result);
	}

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值