【问题标题】:Auditlogging functionality for zend dbzend db 的审计日志功能
【发布时间】:2012-02-24 07:06:10
【问题描述】:

我需要在 zend 项目中实现审计日志记录功能。模型使用zend db创建,更新函数如下。

public function updateGroup($data,$id)
{       
    $row = $this->find($id)->current();
    // set the row data
    $row->name                  = $data['name'];
    $row->description           = $data['description'];

    $row->updatedBy         = $data['updatedBy'];
    $row->updatedOn         = date('Y-m-d H:i:s'); 

    $id = $row->save();
    return $id;
}

我必须使用包含当前用户 ID 的审计日志信息创建一个表。我尝试了很多方法,没有什么是好的解决方案。为 zend 提供良好的审计日志记录功能的最佳实践是什么?

我只想记录修改后的数据。并且日志表架构就像

id, 
table, 
column,
rowId
oldvalue,
newvalue,
updatedon,
updatedbyuser 

【问题讨论】:

    标签: zend-framework


    【解决方案1】:

    使用Zend_Log_Writer_Db

    Zend_Log_Writer_Db 将日志信息写入数据库表,使用 Zend_Db。 Zend_Log_Writer_Db 的构造函数接收一个 Zend_Db_Adapter 实例,一个表名,一个数据库映射 事件数据项的列

    例如:

    $columnMapping = array('name' => 'name', 
                           'desc' => 'desc', 
                           'updatedBy' => 'userid', 
                           'updatedOn' => 'date');
    $writer = new Zend_Log_Writer_Db($db, 'auditlog_table', $columnMapping);
    
    $logger = new Zend_Log($writer);
    
    
    $logger->setEventItem('name', $data['name']);
    $logger->setEventItem('desc', $data['name']);
    $logger->setEventItem('updatedBy',$data['updatedBy']);
    $logger->setEventItem('updatedOn',date('Y-m-d H:i:s'));
    

    EDIT:只记录修改后的数据:

    public function logUpdate(array $values)
    { 
        $columnMapping = array('id' => 'id', 
                               'table' => 'table', 
                               'column' => 'column',
                               'rowId' => 'rowId',
                               'oldvalue' => 'oldvalue',
                               'newvalue' => 'newvalue',
                               'updatedon' => 'updatedon',
                               'updatedbyuser' => 'updatedbyuser');
    
        $writer = new Zend_Log_Writer_Db($db, 'auditlog_table', $columnMapping);
    
        $logger = new Zend_Log($writer);
    
    
        $logger->setEventItem('id', $values['id']);
        $logger->setEventItem('table', $values['table']);
        $logger->setEventItem('column', $values['column']);
        $logger->setEventItem('rowId', $values['rowId']);
        $logger->setEventItem('oldvalue', $values['oldValue']);
        $logger->setEventItem('newValue', $values['newValue']);
        $logger->setEventItem('updatedon', $values['updatedon']);
        $logger->setEventItem('updatedbyuser', $values['updatedbyuser']);
    } 
    

    在 updateGroup 中:

    public function updateGroup($data,$id)
    {       
        $row = $this->find($id)->current();
    
        $values = array('table' => $this->name);
        $values = array('updatedon' => $data['updatedBy']);
        $values = array('updatedbyuser' => date('Y-m-d H:i:s'));
       //go through all data to log the modified columns
        foreach($data as $key => $value){
          //check if modified log the modification
          if($row->$key != $value){
            $values = array('column' => $key);
            $values = array('oldValue' => $row->$key);
            $values = array('newValue' => $value);
            logUpdate($values);
          }
        }
    
        // set the row data
        $row->name                  = $data['name'];
        $row->description           = $data['description'];
    
        $row->updatedBy         = $data['updatedBy'];
        $row->updatedOn         = date('Y-m-d H:i:s'); 
    
        $id = $row->save();
    
    
        return $id;
    }
    

    请注意,最好为所有应用程序实现日志记录并将日志记录与更新分开,请参阅this answer

    【讨论】:

    • 感谢您的回答。但是,这会将所有信息再次写入 db rigt 吗?我只想记录修改后的数据。并且日志表模式类似于 id, table, column,oldvalue,newvalue,updatedon,updatedbyuser
    猜你喜欢
    • 1970-01-01
    • 2018-04-26
    • 2018-01-25
    • 2012-08-31
    • 2011-10-24
    • 2020-05-04
    • 2020-04-13
    • 2011-08-05
    • 2010-10-11
    相关资源
    最近更新 更多