定制日志-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类型。 我知道我可以通过扩展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如下所示,您可以在任何地方使用任意一种方法,前者仅在类中使用:定制日志-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类型。 我
$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的了解:没问题。添加调用类名称是一个好主意。我将采用创建自定义日志流的方法,这应该不会太困难: