MagentoアプリケーションでLog4phpを使用する

Magentoは 、間違いなく電子商取引アプリケーションを構築するための優れたシステムです。 アーキテクチャに定められた原則により、Webアプリケーションのクラスの評価で1位を獲得し、長年にわたってそれを維持するだけでなく、さらに重要なことに、最もエキゾチックな要件を満たす主要機能の拡張機能を作成して、開発者自身のエコシステムを形成することができましたユーザー。 しかし、Magentoが最初の「発射体へのアプローチ」で私を本当に見逃したのは、 Log4phpレベルのロギングシステムでした。 したがって、Magento用に作成された最初の拡張機能は、Log4phpの「ラッパー」です。 カットの下には、Magentoプロジェクトでこの「ラッパー」を使用する方法の説明があります。





ラップ用ラップ



他のモジュールのPraxigento_Logへの依存を減らすために、各モジュールには独自のロガーが含まれています。Magentoアプリケーションの構成に応じて、Praxigento_Logモジュールがインストールされている場合は「ネイティブ」Magento-loggerまたはLog4phpを使用します。



このラッパーのコードは次のとおりです
class Praxigento_Module_Logger { private static $_isLog4phpUsed = null; private $_loggerLog4php; private $_name; function __construct($name) { /** * switch off/on error reporting to prevent messages like * "ERR (3): Warning: include(Praxigento\Log\Logger.php): failed to open stream: No such file or directory" * in case of Praxigento_Log module is not used. */ $level = error_reporting(0); self::$_isLog4phpUsed = class_exists('Praxigento_Log_Logger', true); error_reporting($level); if (self::$_isLog4phpUsed) { $this->_loggerLog4php = Praxigento_Log_Logger::getLogger($name); } else { $this->_name = is_object($name) ? get_class($name) : (string)$name; } } /** * Override getter to use '$log = Praxigento_Log_Logger::getLogger($this)' form in Mage classes. */ public static function getLogger($name) { $class = __CLASS__; return new $class($name); } public function debug($message, $throwable = null) { $this->doLog($message, $throwable, 'debug', Zend_Log::INFO); } /** * Internal dispatcher for the called log method. */ private function doLog($message, $throwable, $log4phpMethod, $zendLevel) { if (self::$_isLog4phpUsed) { $this->_loggerLog4php->$log4phpMethod($message, $throwable); } else { Mage::log($this->_name . ': ' . $message, $zendLevel); if ($throwable instanceof Exception) { Mage::logException($throwable); } } } public function error($message, $throwable = null) { $this->doLog($message, $throwable, 'error', Zend_Log::ERR); } public function fatal($message, $throwable = null) { $this->doLog($message, $throwable, 'fatal', Zend_Log::CRIT); } public function info($message, $throwable = null) { $this->doLog($message, $throwable, 'info', Zend_Log::NOTICE); } public function trace($message, $throwable = null) { $this->doLog($message, $throwable, 'trace', Zend_Log::DEBUG); } public function warn($message, $throwable = null) { $this->doLog($message, $throwable, 'warn', Zend_Log::WARN); } }
      
      









このコードは、すべてのモジュール(クラス自体の名前を除く)で同一であり、アプリケーションにPraxigento_Logモジュールがあるかどうかに関係なくロギングを使用できます。 呼び出しの例を次に示します。



  $log = Praxigento_Module_Logger::getLogger(__CLASS__); $log->trace('trace level message'); $log->debug('debug level message'); $log->info('info level message'); $log->warn('warn level message'); $log->error('error level message'); $log->fatal('fatal level message');
      
      







そして、Praxigento_Logモジュール(Log4phpフレームワーク)を使用したログ自体は次のとおりです。

 2015/06/25 09:59:55,973 TRACE P\B\T\L\UnitTest: trace level message 2015/06/25 09:59:55,973 DEBUG P\B\T\L\UnitTest: debug level message 2015/06/25 09:59:55,974 INFO P\B\T\L\UnitTest: info level message 2015/06/25 09:59:55,974 WARN P\B\T\L\UnitTest: warn level message 2015/06/25 09:59:55,975 ERROR P\B\T\L\UnitTest: error level message 2015/06/25 09:59:55,975 FATAL P\B\T\L\UnitTest: fatal level message
      
      







...そしてそれがない場合(Zend_Logフレームワーク、var / log / system.logファイル):

 2015-06-25T10:07:00+00:00 DEBUG (7): Praxigento_Bonus_Test_Logger_UnitTest: trace level message 2015-06-25T10:07:00+00:00 INFO (6): Praxigento_Bonus_Test_Logger_UnitTest: debug level message 2015-06-25T10:07:00+00:00 NOTICE (5): Praxigento_Bonus_Test_Logger_UnitTest: info level message 2015-06-25T10:07:00+00:00 WARN (4): Praxigento_Bonus_Test_Logger_UnitTest: warn level message 2015-06-25T10:07:00+00:00 ERR (3): Praxigento_Bonus_Test_Logger_UnitTest: error level message 2015-06-25T10:07:00+00:00 CRIT (2): Praxigento_Bonus_Test_Logger_UnitTest: fatal level message
      
      







Log4phpの構成



Magentoは、 Log4php構成ファイルへのパスを指定します。

画像

すべてのロギングパラメータが設定されます。



構成例
 <?xml version="1.0" encoding="UTF-8"?> <configuration xmlns="http://logging.apache.org/log4php/"> <!-- *********************************************************************************************** THIS IS SAMPLE CONFIGURATION THAT WILL BE REWRITTEN ON REINSTALL. DON'T USE THIS FILE IN YOUR CONFIGURATION. MAKE A COPY TO "app/etc/log4php.cfg.xml" AND CHANGE "SYSTEM / CONFIGURATION / DEVELOPER / LOG SETTINGS / LOG4PHP CONFIG FILE NAME" VALUE *********************************************************************************************** --> <!-- Available log levels: ALL -> TRACE -> DEBUG -> INFO -> WARN -> ERROR -> FATAL -> OFF Available appenders: http://logging.apache.org/log4php/docs/appenders.html appenders/LoggerAppenderMemory Available layouts: http://logging.apache.org/log4php/docs/layouts.html --> <!-- default appender --> <appender name="fileDefault" class="LoggerAppenderFile"> <layout class="LoggerLayoutPattern"> <param name="conversionPattern" value="%d{Y/m/d H:i:s,u} %p %c{2}: %m%n"/> </layout> <param name="file" value="/absolute/path/to/file/log4php.log"/> <param name="append" value="true"/> </appender> <!-- In-memory log for Adminhtml (backend sync output) --> <appender name="memoryDefault" class="LoggerAppenderMemory" threshold="DEBUG"> <layout class="LoggerLayoutPattern"> <param name="conversionPattern" value="%date{H:i:s,u} %p %c{2}: %msg%n"/> </layout> </appender> <!-- ERROR mail appender --> <appender name="emailError" class="LoggerAppenderMail"> <layout class="LoggerLayoutPattern"> <param name="conversionPattern" value="%d{Y/m/d H:i:s,u} %p %c{2}: %m%n"/> </layout> <param name="to" value="comma-separeted@emails.com"/> <param name="from" value="project-name@praxigento.com"/> <filter class="LoggerFilterLevelRange"> <param name="levelMin" value="ERROR"/> <param name="levelMax" value="FATAL"/> </filter> </appender> <!-- root logger --> <root> <appender_ref ref="fileDefault"/> <appender_ref ref="memoryDefault"/> <appender_ref ref="emailError"/> <level value="ALL"/> </root> </configuration>
      
      









ボーナスLog4php





レコードソース



ロガーを作成する場合、このロガーが使用されるクラスの名前が使用されます。

  $log = Praxigento_Module_Logger::getLogger(__CLASS__);
      
      





その結果、ログでは、あるクラスのメッセージと別のクラスのメッセージを区別できます。 そのため、Praxigento_Bonus_Test_Logger_UnitTestクラスの場合、ログのメッセージは次のようになります(ロギング設定によって異なります)。

 2015/06/25 09:59:55,973 TRACE P\B\T\L\UnitTest: trace level message
      
      





一般的なフローで特定のクラスからメッセージを選択する必要がある場合に便利です。

 $ cat ./var/log/old/log4php.log_20150623 | grep 'P\\B\\T\\L\\UnitTest'
      
      







ロギングレベルとソースによる差別化



構成ファイルで選択したレベルに応じて、負荷に応じて、またはアプリケーション障害の場合に、ログへの出力の詳細を指定できます。 また、クラスまたはクラスのグループからのすべてのメッセージを個別のログに注ぐことができます。

  <root> <appender_ref ref="defaultLog"/> <level value="INFO"/> </root> <logger name="Praxigento_Bonus_Test_Logger_UnitTest"> <appender_ref ref="failureLog"/> <level value="TRACE"/> </logger>
      
      







メールアラート



エラー(致命的、エラー、警告レベル)の場合、対応するログエントリを電子メールで送信できます。

  <appender name="emailInfo" class="LoggerAppenderMail"> <layout class="LoggerLayoutPattern"> <param name="conversionPattern" value="%d{Y/m/d H:i:s,u} %p %c{2}: %m%n"/> </layout> <param name="to" value="support@praxigento.com,developers@praxigento.com"/> <param name="from" value="some-project@prxgt.com"/> <filter class="LoggerFilterLevelRange"> <param name="levelMin" value="WARN"/> <param name="levelMax" value="FATAL"/> </filter> </appender>
      
      







インメモリロギング



追加のLoggerAppenderMemoryクラスが、モジュール内の元のLog4phpアップダーに追加されました。これにより、Magentoアプリケーションからログにアクセスできます。

  <appender name="memoryDefault" class="LoggerAppenderMemory" threshold="DEBUG"> <layout class="LoggerLayoutPattern"> <param name="conversionPattern" value="%date{H:i:s,u} %p %c{2}: %msg%n"/> </layout> </appender>
      
      







 $log = Praxigento_Module_Logger::getLogger(__CLASS__); $log->debug('...'); $debugLog = LoggerAppenderMemory::getEventsAsArray();
      
      







 <pre class="prxgt_console"> <?php foreach ($debugLog as $entry) { echo trim($entry) . "\n"; }?> </pre>
      
      







アプリケーションでは、管理パネルからタスクを開始する必要がある場合、通常はcronを介して実行される場合、同様のアプローチを使用します。 ログエントリのリストは、必要な詳細レベルとともにWebインターフェイスに表示されるだけです。





設置



現時点では、 Composerを使用してMagentoプロジェクトを展開しているため、この方法のインストールについて説明します。 モジュールのインストールは、 Magento Connectを通じても可能です(以前の名前-Nmmlm_Logの下にあります )。



Composerを介してモジュールを接続するには、composer.jsonファイルで指定する必要があります。

 { "require": { "praxigento/mage_ext_log4php": "*" }, "repositories": [ { "type": "vcs", "url": "https://github.com/praxigento/mage_ext_log4php" } ] }
      
      







モジュールのソースコードをダウンロードして解凍し、。/ src /ディレクトリからMagentoアプリケーションのルートディレクトリにコンテンツをコピーすることもできます。



All Articles