当管理员,进行完了一些操作后,产生了一些行为。
需要进行日志纪录,请问有没有通用的方案。
如果日志能在开发阶段使用,跟踪调试数据更好。
有代码为佳,口头提供想法也行,深表感谢.

解决方案 »

  1.   

    最简单,最笨的方法,
    建一个 全局functionfunction(id) {
    switch(id) {
    case 1:
    title='login';
    }
    insert to table title
    }
    用户登陆后,执行function ,并传递定义好的行为内容
      

  2.   

    写一个公共的log类,在每一个管理员操作的function中,调用这个类记录日志。调用时可以指定记录级别(TRACE、DEBUG、INFO、WARNING、ERROR),log类中可以设定输出级别,开发时可以设定为TRACE或DEBUG,生产环境可以换为ERROR
      

  3.   

    举个例子。。
    架设是用 单一的入口(比如index.php) 使用类似index.php?module=xxx&action=xxx的url访问。。
    建立一个哈希表 module + action -> "具体的操作信息"
    然后 将日志操作添加到入口文件。。
      

  4.   


    /*************************
     *@param 功能描述:記錄管理員的所有操作.
     *@param 每個頁面都存在:操作記錄有:增刪改差.
     *@param time 2009-11-16
     *@param $oper_content:操作內容
     *@param $error:失敗原因
     *@param 是否成功:操作內容
     *************************/
    function Operation_Log($oper_content,$is_true,$error="",$admin_id)
    {
    $operation_url=getenv('REQUEST_URI'); //操作頁面
    $current_time = time();
    $sql_insert_operations_log="INSERT INTO `operation_logs` ( `operation_id` , `operation_admin_id` , `operation_time` , `operation_page` , `operation_content` , `operation_is_true` , `operation_error` )
    VALUES (NULL , $admin_id , '$current_time' , '$operation_url' , '$oper_content', '$is_true', '$error');";
    $a=mysql_query($sql_insert_operations_log) or die ("insert operation_log error".mysql_error());
    }
      

  5.   

    建立一个哈希表 module + action -> "具体的操作信息"'hash 表,very nice!
      

  6.   

    采用观察者模式,让主题(管理员的各种行为)和观察者(日志 ,刷静态,统计,其它...)处理有点复杂,我尽量简化,希望对楼主有所帮助.//备注:本代码在ci 框架下实现。
    interface iobserver
    {
    function update($sender,$args);
    }
    class ob
    {
    function ob(){}
    }/**
     * 文本日志观察者
     * */
    class log_ob implements iobserver{
    function  update($sender,$args){
    $log_file = $_SERVER['DOCUMENT_ROOT']."/logs/".$args[action].date("Y-m-dH").".html";
            $text = "{action:$args[action],adminName:".$args["session"]->user_username.",title:$sender[title],info:$sender[info]}";
            CS_log($text,$log_file);
    }
    }/**
     * *刷my fav 数据
     */
    class make_fav implements  iobserver 
    {
    function update($sender,$args)
    {
    //约150行代码......实现某个生成个人fav 配置静态数据的代码.
    }

    /**
     * *
     *
     * @param 将表达式解析 $str
     * @return 解析后的表达式的值
     */
    function get_eval($str)
    {
    return   eval($str);
    }

    }
    /**生成top*/
    class maketop implements iobserver
    {
    function  update($sender,$args){
    //约150行代码......实现某个生成个人顶部导航文件 配置静态数据的代码.
    }
    }class make_left
    {
      static $left_bar =  "outlookbar=new outlook(); var t;";          //CI对象的实例
      
     function  update($sender,$args){ 
      //约200行代码......实现某个生成左侧导航菜单配置静态数据的代码.
     }
    }}
    /**
     * 数据库日志观察者
     */
    class dblog_ob implements iobserver{
    function  update($sender,$args){

    $CI = &get_instance();
    $model_name = CS_get_model_name("ylog");
    $CI->load->model($model_name); //载入后台用户模型

    $data["ylog_cate"] = $args["action"];
    $data["ylog_vtitle"] = $args["session"]->user_username;
    $data["ylog_title"] = $sender["title"];
    $data["ylog_cid"] = $sender["ylog_cid"];
    $data["ylog_info"] = $sender["info"];
    $CI->$model_name->insert($data);

    }
    }主题相关./***
     * 主题 
     */
    abstract class subject
    {
    public $ob_array;
    public $sender;
    public $args;
    function addOb($ob)
    {
    $this->ob_array[]=$ob;
    }

    function set_obj($obj,$args = array(""))
    {
    $this->sender = $obj;
    $this->args = $args;
    }

    function delOb($ob)
    {

    }
    function notify()
    {
    foreach ($this->ob_array as $val)
    {
    $val->update($this->sender,$this->args);
    }
    }
    }
    /**
     * * 管理员行为主题
     *
     */
    class adminAction extends  subject 
    {
    function adminAction()
    {
    $this->addOb(new log_ob());
    }
    }//用法
    /**
     * *
     *
     * @param 标题 $title
     * @param 数据 $data
     * @param 类别 $cid
     * @param 处理表格 $table
     * @param 行为 $action
     * @param 观察者列表 $array_observer
     */
    function log_db($title,$data,$cid,$table,$action,$array_observer_entend = array(''))
    {
          load_class("ob"); //加载观察者类和主题类
     $me = new adminAction();
       $me->addOb(new dblog_ob());
     if(is_array($array_observer) && sizeof($array_observer))
     {
      foreach ($array_observer as $observer)
      {
       $me->addOb(new $observer());
      }
     }
       
      $sender["table"] = $table;
      $sender["ylog_cid"] = $cid;

      $sender["title"] = "<font color = 'blue'>".$_SESSION['admin_user_data']->user_username."</font>于".date("Y-m-d H:i:s")."<font color=green>$title</font>";
          foreach ( $data as $key=>$val):
          $str_data_array[]="$key=>$val";
       endforeach;
        
      $str_data = implode(",",$str_data_array);
          $sender["info"] = "$str_data";
      $me->set_obj($sender,array("action"=>"$action","session"=>$_SESSION['admin_user_data']));
      $me->notify();
    }当有各种新的变化时.
    log_db($title,$data,$cid,$table,$action,$array_observer_entend = array('')
    往$array_observer_entend 里面塞。
    例如,当修改菜单数据时,需要进行日志记录,同时也需要刷菜单文件。则
      log_db('修改菜单'.$this->description.':'.$data[$title_name],$data,2,$this->tableName,'insert',array("maketop","make_left"));
    则会在调用 dblog_ob 观察者进行日志记录后,再调用make_left 观察者进行刷静态文件。
    能表达出来的,就这么多了,真正的代码,还有很多要理清的东西,我的感觉是,不实践,很难体会那种为了交互对象之间的松耦合设计而努力的设计原则。的感觉。