所以我想开始登录我的Zend Framework应用程序.我想在我的引导程序中的某处注册记录器,以便我可以从任何控制器操作轻松访问它.我认为这应该是以前做过的简单事情,但我该怎么做呢?
文档显示了这样的内容,但是每次我想记录某些东西时我都不想创建一个新的Zend_Log:
$writer = new Zend_Log_Writer_Stream('/path/to/my/log/file');
$logger = new Zend_Log($writer);
$logger->log('Informational message', Zend_Log::INFO);
Run Code Online (Sandbox Code Playgroud)
这就是我提出的.感谢关于Zend_Registry的提醒!
// in /application/Bootstrap.php
protected function _initLogger()
{
$writer = new Zend_Log_Writer_Stream('php://output');
$logger = new Zend_Log($writer);
Zend_Registry::set('logger', $logger);
}
// in controller actions
$logger = Zend_Registry::get('logger');
$logger->log('message');
Run Code Online (Sandbox Code Playgroud) 我想使用Zend_Debug :: dump,在日志中保留一些变量,但由于我安装了xdebug,并且xdebug替换了php的var_dump,因此我在log中的值是xdebug生成的html值.
我想知道是否有一种方法在PHP中禁用此功能,并再次启用它,以便我可以将它们放在此行的上方和下方:
$Message = Zend_Debug::dump($objects, null, false);
Run Code Online (Sandbox Code Playgroud) 我想知道通过ZF2中的ServiceManager启动和重用logger实例的最佳方法是什么.当然,我可以在任何类中使用一种简单的方法,例如:
public function getLogger () {
$this->logger = new Logger();
$this->logger->addWriter(new Writer\Stream('/log/cms_errors.log'));
return $logger;
}
Run Code Online (Sandbox Code Playgroud)
但我想知道在global.php中注册类似结构的最佳方法是什么.到目前为止,我可以
将以下内容添加到global.php中
'Zend\Log'=>array(
'timestampFormat' => 'Y-m-d',
array(
'writerName' => 'Stream',
'writerParams' => array(
'stream' => '/log/zend.log',
),
'formatterName' => 'Simple',
),
),
Run Code Online (Sandbox Code Playgroud)
如果我尝试通过以下方式调用它:
$this->getServiceLocator()->get('Zend\Log')
Run Code Online (Sandbox Code Playgroud)
我得到一个:
Zend\ServiceManager\ServiceManager::get was unable to fetch or create an instance for Zend\Log
Run Code Online (Sandbox Code Playgroud) 我刚开始学习Zend Framework 2作为Zend Framework 1的长期开发人员.围绕新术语缠绕我有点麻烦.
回到ZF1,如果我想创建一个对应用程序是全局的记录器,我会将配置添加到application.ini文件中,引导程序会将其初始化为资源(我希望我说的是正确的).那么从我的任何模块控制器,我可以通过bootstrap资源访问记录器.
输入ZF2,模块是一个有点不同的野兽,它们是自包含的,但我对它们如何与应用程序交互有点困惑.在我看来,这就是ServiceManager发挥作用的地方.我的目标是,让我的模块(不是控制器,而不是模块本身)检查应用程序是否定义了记录器,如果有,则在整个模块中使用该记录器.如果应用程序没有定义记录器,我希望模块为模块范围的日志记录定义记录器.
这个问题也与数据库有关,假设我想让应用程序定义数据库连接的逻辑,而我希望模块定义它所需的表的逻辑.我究竟如何配置它,以及如何在应用程序中定义数据库资源时如何/在何处判断.
注意:我已经浏览了Rob Allen的快速入门(相当充分的信息和我发现的唯一缺乏默默无闻的资源)和ZF2(readthedocs),并且已经用谷歌搜索过了.我发现的是,当涉及到某些拼图的"哪里"时,信息通常是非常模糊的.
问题的背景
Zend_Log的分析揭示了以下类图
Zend_Log进行:
Zend_Log_Writer_Abstract
问题
问候!
如何更改Zend_Log的日期格式?
现在每个新日志条目前都有添加时间戳的日期:
"2013-01-28T16:47:54 + 01:00 ......某些日志消息..."
但我想格式化这个日期:
"Ymd H:我:s ...一些日志消息..."
我的代码看起来像这样:
class Game_Logger {
public function __construct($val, $txt = null) {
$writer = new Zend_Log_Writer_Stream(APPLICATION_PATH . '/../log/log.log');
$logger = new Zend_Log($writer);
if (is_array($val)) {
$output = Zend_Debug::dump($val, null, false);
} else {
$output = $val;
}
if($txt){
$output = $txt.' '.$output;
}
$logger->info($output);
}
}
Run Code Online (Sandbox Code Playgroud) 我不知道如何使用Doctrine2配置Zend\Log.仅允许您通过连接适配器直接写入数据库或写入文件.
是否可以为整个应用程序设置默认日志级别?我想从application.ini中设置它.我想设置记录器来登录数据库和firephp.
我正在尝试找出配置Zend_Log_Writer_Stream实例的最佳方法,以写入相对于我的APPLICATION_PATH的文件名.
例如,使用以下配置:
resources.log.stream.writerName = "Stream"
resources.log.stream.writerParams.stream = "logs/production.log"
Run Code Online (Sandbox Code Playgroud)
初始化loggger的常规方法是使用应用程序引导资源或执行以下操作:
$logger = Zend_Log::factory($config->resources->log);
Run Code Online (Sandbox Code Playgroud)
这样做的问题是Zend_Log_Writer_Stream :: factory方法将尝试访问相对于当前脚本执行的文件,而不是APPLICATION_PATH.
因为几乎总是index.php里面/ public通常它不是戏剧性的,所以当我在我的单元测试目录中执行单个脚本时,它将使用该目录来建立路径.
理想情况下,我希望能够设置:
resources.log.stream.writerParams.stream = APPLICATION_PATH . "../logs/production.log"
Run Code Online (Sandbox Code Playgroud)
因此它总是使用可预测的位置.我宁愿不必破解Zend_Log继承类的工厂方法来使其工作.
我很想知道其他人是如何解决这个问题的.
我的配置中有一个记录器,如下所示:
resources.log.stream.writerName = "Stream"
resources.log.stream.writerParams.stream = APPLICATION_PATH "/../logs/err.log"
resources.log.stream.writerParams.mode = "a"
resources.log.stream.filterName = "Priority"
resources.log.stream.filterParams.priority = 3
Run Code Online (Sandbox Code Playgroud)
但我想将它用于错误日志.对于另一个日志想要使用另一个日志文件.出于这个原因,我将这些行添加到app.ini
resources.log.stream.writerName = "Stream"
resources.log.stream.writerParams.stream[] = APPLICATION_PATH "/../logs/debug.log"
resources.log.stream.writerParams.stream[] = APPLICATION_PATH "/../logs/info.log"
resources.log.stream.writerParams.mode = "a"
resources.log.stream.filterName = "Priority"
resources.log.stream.filterParams.priority[] = 7
resources.log.stream.filterParams.priority[] = 5
Run Code Online (Sandbox Code Playgroud)
但这不起作用我想使用differetn文件的不同优先级.但是记录器会覆盖第一个记录器.怎么样 ?
我想使用Zend Framwork的Log机制作为一个独立的组件,这意味着我想从ZF只需要Log,我该怎么做?
我试图通过application.ini文件进行日志记录,我遇到了错误.
resources.log.db.writerName = "Db"
resources.log.db.writerParams.db.adapter = "PDO_SQLITE"
resources.log.db.writerParams.db.dbname = ROOT "/data/tmp.db3"
resources.log.db.writerParams.db.table = "logs"
resources.log.db.writerParams.db.columnMap.priority = "priority"
resources.log.db.writerParams.db.columnMap.message = "message"
Fatal error: Call to a member function insert() on a non-object in /var/www/libs/zend/library/Zend/Log/Writer/Db.php on line 137
Run Code Online (Sandbox Code Playgroud) 我们正在使用zend框架2用于新的应用程序,我想拥有相同的Rails或类似的日志系统,我希望每个请求都有一个日志,可以在Zend中执行此操作吗?