Joomla >1.7 从浏览器隐藏日志消息

Posted

技术标签:

【中文标题】Joomla >1.7 从浏览器隐藏日志消息【英文标题】:Joomla >1.7 hide log messages from browser 【发布时间】:2013-01-01 14:00:33 【问题描述】:

我正在为 Joomla! 开发一个扩展;目前我正在尝试使其与 3.0 兼容 - 与 3.0 一样,日志记录发生了一些变化(*)。基于答案from this related question,我当前的代码如下所示:

JLog::addLogger(array(
    'text_file' => 'plg_system_myplg.log.php'
)); 
JLog::add('blah blah log msg');

问题是日志也会转到显示给用户的消息 - 我想防止这种情况发生,我希望日志消息只转到日志文件。我认为这与JLog::add 作为第三个(可选)参数的“类别”有关,但我不知道该传递什么?

谁能告诉我如何隐藏消息/或告诉我我的分类方法是否正确以及我应该使用什么值?

谢谢!

(*) 到目前为止,它实际上已经在 1.7 中发生了变化,但是在 JLog::getInstance(...) 返回时调用 addEntry 的旧方法似乎已从 2.5 删除到 3.0。

编辑:认为我现在找到了方法;使用:

JLog::addLogger(array(
    'text_file' => 'plg_system_myplg.log.php',
    JLog::ALL,
    'myplg'
)); 

JLog::add('blah blah log msg', JLog::INFO, 'myplg');

我所有的日志条目只进入我的日志文件(而不是显示给用户的消息)。但是,我也收到了一些弃用警告 - 一个关于我的代码,还有一些不相关的警告:

WARNING deprecated  JAccess::getActions is deprecated. Use JAccess::getActionsFromFile or JAcces::getActionsFromData instead.
WARNING deprecated  JSubMenuHelper::getEntries() is deprecated. Use JhtmlSidebar::getEntries() instead.
WARNING deprecated  JSubMenuHelper::getFilters() is deprecated. Use JHtmlSidebar::getFilters() instead.
WARNING deprecated  JSubMenuHelper::getAction() is deprecated. Use JHtmlSidebar::getAction() instead.

不知道该怎么做 - 为什么它们会出现在我的日志文件中,它们不应该转到默认的 error.log 文件而不是我的文件吗?

【问题讨论】:

【参考方案1】:

这是我正在使用的,适用于 Joomla 1.5 - 3.2:

if(version_compare(JVERSION,'1.7.0','ge')) 
   jimport('joomla.log.log'); // Include the log library (J1.7+)   
   $priorities = JLog::ALL ^ JLog::WARNING; // exclude warning (because of deprecated)
   // In J3.0 we need to ensure that log messages only go to our file, thus use the categories (already supported in J2.5)      
   if(version_compare(JVERSION,'2.5.0','ge')) 
      $logCategory = 'com_mycomponent';
      JLog::addLogger(array('text_file' => $logFileName), $priorities, $logCategory);
      JLog::add($msg, JLog::INFO, $logCategory);
   else
      JLog::addLogger(array('text_file' => $logFileName), $priorities);
      JLog::add($msg, JLog::INFO);
   
 else 
   // Joomla! 1.6 and 1.5
   jimport('joomla.error.log'); // Include the log library
   $log = &JLog::getInstance($logFileName);
   $log->addEntry(array('comment' => $msg, 'level' => 'INFO'));   

这显示了获取已弃用消息的技巧。

是的,您必须为您的消息添加一个类别,以确保它们不会显示为系统消息。

【讨论】:

好的,所以通过忽略“警告”级别的消息,您可以摆脱弃用消息。但这并不能真正解释为什么它们首先出现在日志中 - 它有效地使日志级别 WARNING 无用,它不能再用于其他消息。是这样的吗?我也使用类别(现在),我不明白为什么这些警告会出现在我的日志中,你知道吗? 没错。我通过使用 JLog::ALERT 而不是 JLog::WARNING 解决了这个问题。我的日志类只是用另一个替换了一个,所以我可以摆脱那些已弃用的。 DEBUG、INFO、ALERT 和 ERROR 级别足以满足我的需求。 感谢您的详尽回答,我会在接下来的几天试一试! 在仔细查看我的日志文件后 - 我也有 NOTICE 和 INFO 消息(“无法识别浏览器版本。代理:...”和“FinderIndexerAdapter::getTypeId”) '不产生(类别“-”),所以我想没有办法专门禁用除属于我的插件之外的所有消息进入我的日志文件;尝试通过 loglevel 似乎并没有真正解决它...会为此提出一个新问题,但非常感谢您的努力! 将接受这个答案,因为它解决了我原来的问题。对于其他问题的任何想法仍然非常受欢迎......【参考方案2】:

使用

 new JException('Something happened');

这只会将它添加到调试日志中,但不会显示任何内容。

【讨论】:

可能是个愚蠢的问题,但调试日志是什么?一个单独的日志文件?我想写入自己的日志文件,实际上,那样对我来说似乎更干净......【参考方案3】:

看来,Joomla 3.0 没有启用默认记录器。在 Joomla 3.0.3 中也是如此。默认情况下,没有任何东西会打开登录 - 甚至是调试模式。

【讨论】:

您的意思是我的日志中有这些消息的原因是因为没有默认记录器,所以所有内容都会进入我的日志?如果是这样,那可能是对所见行为的解释,但它并不能真正帮助解决任何问题,抱歉。 另外,根本没有解释为什么我的日志目录中有一个“error.php”(它确实收到了一些类别为“Joomla”的信息消息,但不是那些类别为“-”的信息)...【参考方案4】:

最后我想我已经解决了我的问题,出现了不相关的日志条目。

仔细观察at the API documentation of the addLogger function 发现第三个参数$categories 应该是一个将使用此日志的类别数组。

这与撰写本文时的最新版本 http://docs.joomla.org/Using_JLog 相矛盾,其中给出了单个类别而不是数组。

将我的调用更改为 addLogger 以使用数组,如下所示:

JLog::addLogger(array(
    'text_file' => 'plg_system_myplg.log.php',
    JLog::ALL,
    array('myplg')
)); 

请放心,这将解决问题!

编辑:不幸的是,即使这仍然不能解决我的问题 - 仍然有不相关的条目:(。

【讨论】:

【参考方案5】:

我找到了答案..希望这个脚本能让你理解..我已经构建为 function 。此代码适用于 joomla 3。希望适用于 joomla 2

<?php 
function logWrite($level, $values, $file='%s.php',$path='',$showOnTop=0,
$option='',$component='')
/****
jlog Joomla 3.4
created by:gundambison (2015.04.26). 
THX: hbit@***
****/
    jimport('joomla.log.log'); 
    $level=strtoupper($level);  
//You can change this com_name
    $component= $component==''? 'com_gundambison': $component;
    $date= date("Ymd");
    $filename= sprintf($file, $date);
    $format= $option=='' ?"TIME\tCLIENTIP\tCATEGORY\tMESSAGE": $option;

// create options and text
    $txt = is_array($values)? json_encode($values): $values;
    $options = array('text_file' => $filename,'text_entry_format'=>$format );
    $options['text_file_path']=$path==''?'logs': $path; 
    JLog::addLogger ($options);
/*
if you want the error to show in your page. just see the different 
*/  
    if($showOnTop==1)
        JLog::add("$txt");
    
    else 
        JLog::add("$level\t$txt",$level,$component);
    

【讨论】:

欢迎来到 *** 并感谢您的回答。但是,我看不到它真正添加了哪些信息到已经存在的信息中? add 方法的必要附加参数已在其他答案中进行了说明。 首先我要感谢你.. 你让我找到了答案。谢谢指正

以上是关于Joomla >1.7 从浏览器隐藏日志消息的主要内容,如果未能解决你的问题,请参考以下文章

怎样安装Joomla 1.7网站系统

对注册用户隐藏的 Joomla 模块

如何从 joomla 的后端菜单中删除/隐藏某些组件?

Joomla 1.7:所见即所得编辑器不起作用

如何在自定义模块(Joomla 1.7)中使用自定义组件中的函数?

Joomla 2.5 Uncaught ReferenceError:Joomla未定义