定义用户活动记录器的良好结构

时间:2017-03-18 14:57:16

标签: php logging silex php-7

我使用Silex框架开发此Web应用程序,我想在我的数据库(mysql)中存储不同的用户活动/事件,例如当用户登录,注销,创建内容,更新内容等时 此日志的目的是在某个特定日期返回并查看例如ID 2登录2次的用户,他创建了2个新xx并更新了3 xx。

对于我想要存储在数据库中的每个事件,我想要保存登录用户的userId,事件(字符串,例如登录)和事件的URL,例如https://mydomain.dev/login。但你怎么能回去呢?是的我在我的表上创建了一个名为created的字段,默认为CURRENT_TIMESTAMP。

我坚持在哪个方向创建这个Logger类。 此时,我有一个LoggerInterface,在这里我定义了一个静态日志函数。

interface LoggerInterface
{
    public static function log(LogEvent $logEvent);
}

现在我的问题是,创建不同活动的最佳方式是什么。

创建一个抽象的LogEvent类,它包含日志事件的属性,如

abstract class LogEvent {
    protected $type;
    protected $url;
}

这样我可以为每个事件创建一个类,并在我的例子中定义我的类型。 LoginLogEvent类:

class LoginLogEvent extends LogEvent
{
    protected $type = 'login';
}

我定义这样的类型的方式是一个好的方法,或者我应该创建一个常量文件,在那里我定义我想要跟踪的所有活动,例如。

class LogEvents
{
    const LOGIN = "login";
}

然后在我的LoginLogEvent类中:

class LoginLogEvent extends LogEvent
{
    protected $type = LogEvents::LOGIN;
}

我还可以沿着以下几行创建一个构造函数:

class LoginLogEvent extends LogEvent
{
    protected $type;
    protected $url;

    public function __construct($type, $url){
        $this->type= $type;
        $this->url= $url;
    }
}

好东西,但是当我想记录某些内容时...我可能会创建一个类似这样的LogHandler类:

class LogHandler implements LoggerInterface
{
    public static function log(LogEvent $logEvent)
    {
        // TODO: Implement log() method.
    }
}

然后我会在$ logEvent->类型上创建一个switch case,并基本上将事件的类型,url写入数据库。

谢谢你,周末愉快:)

1 个答案:

答案 0 :(得分:0)

Silex已经支持Monolog以提供您需要的所有功能。您还可以添加WebProcessor以向已记录的数据添加URL,IP等,其中包括从调试到关键和放大的各种级别。紧急状态。