定制日志-CakePHP(1.3)

定制日志-CakePHP(1.3),php,cakephp,cakephp-1.3,Php,Cakephp,Cakephp 1.3,我想扩展cakephp日志记录功能。 使用 您可以将带有$level的$msg记录到tmp/logs/$level.log 我希望如何使用日志记录: 不同级别的单独功能,例如用于日志记录的$this->debug$msg for$this->log$msg'debug'和$this->error$msg for$this->log$msg'error'等。 自动将类的名称放在消息前面,例如,$this->debug$msg将导致MyClass:$msg,如果$this属于MyClass类型。 我

我想扩展cakephp日志记录功能。 使用

您可以将带有$level的$msg记录到tmp/logs/$level.log

我希望如何使用日志记录:

不同级别的单独功能,例如用于日志记录的$this->debug$msg for$this->log$msg'debug'和$this->error$msg for$this->log$msg'error'等。 自动将类的名称放在消息前面,例如,$this->debug$msg将导致MyClass:$msg,如果$this属于MyClass类型。 我知道我可以通过扩展AppModel、AppController等来扩展功能,但由于我在应用程序中的任何地方都需要这些功能,我宁愿扩展cakephp的对象,但没有找到一种稳定的机制,我不想在cake/文件夹中更改它。 我想为该功能实现一个新类,但我不确定如何在cakephp中实现它

您能给我一些提示,我可以在哪里/如何巧妙地实现这些扩展吗?

全局便利方法

好吧,至少在PHP5.2中不能真正做到这一点,对于那些在你离开后必须维护代码的开发人员来说,这可能是一件好事

CakePHP是一个具有严格约定的MVC框架,它使您很难打破MVC范式,只允许您单独扩展所需的部分,即AppModel、AppController、,并且保持面向对象的基础在内核中不受干扰,使得很难添加可以到处使用的代码来进行潜在的滥用。

至于添加超越所有MVC分离的功能,这里是app/config/bootstrap.php。当您将代码放在这里时,很明显它不是框架的一部分,但允许您在加载CakePHP之前添加这些基本内容。在这里可以选择以下几种方法:

创建一个函数,例如一些自定义函数,如error,以您喜欢的方式调用CakeLog::write。 加载一个类,比如加载你自己的日志类。。日志,因此您可以在适当的位置调用Log::error 见下文: 记录器API

Cake允许对诸如logger之类的东西进行许多定制,但不幸的是,在本例中,暴露给我们的API已经在核心中定义。用于登录CakePHP的API如下所示,您可以在任何地方使用任意一种方法,前者仅在类中使用:

$this->log($msg, $level) // any class extending `Object` inherits this
// or
CakeLog::write($level, $message); // this is actually what is called by the above
您试图消除的任意$level参数实际上是:

我们只是创建了一个全新的日志类型,没有编写额外的代码行,我们的代码的意图非常清楚

自定义记录器

如果我们希望:

function log($msg, $type = LOG_ERROR) {
    if (!class_exists('CakeLog')) { // winning
        require LIBS . 'cake_log.php';
    }
    // ...
如您所见,core CakeLog类只有在不存在此类类的情况下才会被实例化,这使您有机会插入自己创建的内容或一个精确的副本,只需进行一些调整—尽管您希望在升级时手动将更改与core同步:

// app/config/bootstrap.php
App::import('Lib', 'CakeLog'); // copy cake/libs/cake_log.php to app/lib/cake_log.php
以上内容将使您能够完全控制应用程序中CakeLog类的实现,因此您可以执行类似于将调用类名动态添加到日志消息中的操作。但是,一种更直接的方法和其他类型的日志记录(如数据库)是:

TL;DR-尽管您可以在CakePHP引导之前加载自己的代码,或者在提供的每个MVC层中单独使用,但不应该篡改core提供的对象层次结构。这使得添加全局继承的类方法变得困难

我的建议是:使用提供给您的API,集中精力添加更多功能,而不是语法上的微妙之处:

全局便利方法

好吧,至少在PHP5.2中不能真正做到这一点,对于那些在你离开后必须维护代码的开发人员来说,这可能是一件好事

CakePHP是一个具有严格约定的MVC框架,它使您很难打破MVC范式,只允许您单独扩展所需的部分,即AppModel、AppController、,并且保持面向对象的基础在内核中不受干扰,使得很难添加可以到处使用的代码来进行潜在的滥用。

至于添加超越所有MVC分离的功能,这里是app/config/bootstrap.php。当您将代码放在这里时,很明显它不是框架的一部分,但允许您在加载CakePHP之前添加这些基本内容。在这里可以选择以下几种方法:

创建一个函数,例如一些自定义函数,如error,以您喜欢的方式调用CakeLog::write。 加载一个类,比如加载你自己的日志类。。日志,因此您可以在适当的位置调用Log::error 见下文: 记录器API

蛋糕确实允许许多定制 类似于logger的东西,但不幸的是,在本例中,暴露给我们的API已经在核心中定义。用于登录CakePHP的API如下所示,您可以在任何地方使用任意一种方法,前者仅在类中使用:

$this->log($msg, $level) // any class extending `Object` inherits this
// or
CakeLog::write($level, $message); // this is actually what is called by the above
您试图消除的任意$level参数实际上是:

我们只是创建了一个全新的日志类型,没有编写额外的代码行,我们的代码的意图非常清楚

自定义记录器

如果我们希望:

function log($msg, $type = LOG_ERROR) {
    if (!class_exists('CakeLog')) { // winning
        require LIBS . 'cake_log.php';
    }
    // ...
如您所见,core CakeLog类只有在不存在此类类的情况下才会被实例化,这使您有机会插入自己创建的内容或一个精确的副本,只需进行一些调整—尽管您希望在升级时手动将更改与core同步:

// app/config/bootstrap.php
App::import('Lib', 'CakeLog'); // copy cake/libs/cake_log.php to app/lib/cake_log.php
以上内容将使您能够完全控制应用程序中CakeLog类的实现,因此您可以执行类似于将调用类名动态添加到日志消息中的操作。但是,一种更直接的方法和其他类型的日志记录(如数据库)是:

TL;DR-尽管您可以在CakePHP引导之前加载自己的代码,或者在提供的每个MVC层中单独使用,但不应该篡改core提供的对象层次结构。这使得添加全局继承的类方法变得困难


我的建议是:使用提供给您的API,集中精力添加更多功能,而不是语法上的微妙之处:

除了deizel说的很棒的东西,顺便说一句,deizel,你不必使用Cake's logger。欢迎您使用任何您想要的日志记录系统。选择您喜欢的现有日志框架可能是最安全的选择。php是执行任何require调用或初始化的好地方

否则,如果您想在“蛋糕”中做一些事情,我建议您创建一个包含三个日志接口的插件:一个组件、一个行为和一个助手。这样,日志功能将在模型、视图和控制器中可用。至于如何编码,我喜欢将cake类精简为真正日志类的代理,并使用神奇的方法调用代理来解析日志请求和环境,然后将该信息转发给日志记录器以统一处理


你可以写一些东西,比如$this->MyLogger->oopstubbed my toe,可能会有一个oops.log文件,里面有你的消息,还有任何你想包含的额外信息,比如controller/view/model、time和date等等。

除了deizel说的很棒的东西之外,顺便说一句,deizel,你不必使用Cake的记录器。欢迎您使用任何您想要的日志记录系统。选择您喜欢的现有日志框架可能是最安全的选择。php是执行任何require调用或初始化的好地方

否则,如果您想在“蛋糕”中做一些事情,我建议您创建一个包含三个日志接口的插件:一个组件、一个行为和一个助手。这样,日志功能将在模型、视图和控制器中可用。至于如何编码,我喜欢将cake类精简为真正日志类的代理,并使用神奇的方法调用代理来解析日志请求和环境,然后将该信息转发给日志记录器以统一处理


您可以编写类似$this->MyLogger->oopstubbed my toe这样的内容,并且可能会有一个oops.log文件,其中包含您的消息以及您希望包含的调用controller/view/model、time和date等的任何附加信息。

当然可以。当您提到使用现有的日志框架时,它提出了一个有效的观点。。你可以“在”蛋糕里做一些事情,但最终你会得到一个行为/组件/视图三人组,这个三人组只能并且应该通过将其打包为插件来重用。如果你能找到一个现有的库并将其放入app/vendors或app/libs中(如果有的话),不要重新发明轮子。或者,你的建议非常正确地实现了OP的愿望,即简单地调用$thing->fillinblank$stuff。当您提到使用现有的日志框架时,它提出了一个有效的观点。。你可以“在”蛋糕里做一些事情,但最终你会得到一个行为/组件/视图三人组,这个三人组只能并且应该通过将其打包为插件来重用。如果你能找到一个现有的库并将其放入app/vendors或app/libs中(如果有的话),不要重新发明轮子。或者,你的建议非常正确地实现了OP的愿望,即简单地调用$thing->Fillingblank$stuff。谢谢你,deizel,我从中学到了很多。将类名与日志消息一起使用有助于跟踪错误消息。你说得对,功能更重要,但我只是好奇,喜欢
扩展我关于cakephp的知识:没问题。添加调用类名称是一个好主意。我会采取创建自定义日志流的方法,这应该不会太困难:谢谢你,deizel,我从中学到了很多。将类名与日志消息一起使用有助于跟踪错误消息。你说得对,功能更重要,但我只是好奇,想扩展我对cakephp的了解:没问题。添加调用类名称是一个好主意。我将采用创建自定义日志流的方法,这应该不会太困难: