First working implementation of database log writer devlog-3_aborted
authorfrancois <francois@735d13b6-9817-0410-8766-e36946ffe9aa>
Mon, 6 Dec 2010 21:30:39 +0000 (21:30 +0000)
committerfrancois <francois@735d13b6-9817-0410-8766-e36946ffe9aa>
Mon, 6 Dec 2010 21:30:39 +0000 (21:30 +0000)
PHP5ized class tx_devlog
Removed some legacy code
references #2748

git-svn-id: https://svn.typo3.org/TYPO3v4/Extensions/devlog/trunk@40908 735d13b6-9817-0410-8766-e36946ffe9aa

class.tx_devlog.php
ext_localconf.php
ext_tables.sql
interfaces/interface.tx_devlog_logwriter.php
writers/class.tx_devlog_writers_database.php

index d5814e9..7eaa8d7 100644 (file)
@@ -1,58 +1,53 @@
 <?php
 /***************************************************************
 *  Copyright notice
-*  
+*
 *  (c) 2004 Rene Fritz (r.fritz@colorcube.de)
-*  (c) 2009 Francois Suter (typo3@cobweb.ch)
+*  (c) 2010 Francois Suter (typo3@cobweb.ch)
 *  All rights reserved
 *
-*  This script is part of the TYPO3 project. The TYPO3 project is 
+*  This script is part of the TYPO3 project. The TYPO3 project is
 *  free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
-* 
+*
 *  The GNU General Public License can be found at
 *  http://www.gnu.org/copyleft/gpl.html.
-* 
+*
 *  This script is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  This copyright notice MUST APPEAR in all copies of the script!
-*
-*  $Id$
 ***************************************************************/
 
 
-/** 
+/**
  * devlog function for the 'devlog' extension.
  *
- * @author     Rene Fritz <r.fritz@colorcube.de>
- * @author     Francois Suter <typo3@cobweb.ch>
+ * @author             Rene Fritz <r.fritz@colorcube.de>
+ * @author             Francois Suter <typo3@cobweb.ch>
+ * @package            TYPO3
+ * @subpackage tx_devlog
+ *
+ *  $Id$
  */
 class tx_devlog {
-       var $extKey = 'devlog'; // The extension key
-       var $extConf = array(); // The extension configuration
-       var $rowCount; // The number of rows in the devlog table
+       public $extKey = 'devlog';      // The extension key
+       public $extConf = array(); // The extension configuration
+       protected $rowCount; // The number of rows in the devlog table
 
        /**
         * Constructor
         * The constructor just reads the extension configuration and stores it in a member variable
         */
-       function __construct() {
+       public function __construct() {
                $this->extConf = unserialize($GLOBALS['TYPO3_CONF_VARS']['EXT']['extConf'][$this->extKey]);
        }
 
        /**
-        * PHP 4 wrapper for the constructor method
-        */
-       function tx_devlog() {
-               $this->__construct();
-       }
-
-       /**
         * Developer log
         *
         * $logArr = array('msg'=>$msg, 'extKey'=>$extKey, 'severity'=>$severity, 'dataVar'=>$dataVar);
@@ -60,11 +55,11 @@ class tx_devlog {
         * 'extKey'             string          Extension key (from which extension you are calling the log)
         * 'severity'   integer         Severity: 0 is info, 1 is notice, 2 is warning, 3 is fatal error, -1 is "OK" message
         * 'dataVar'    array           Additional data you want to pass to the logger.
-        * 
+        *
         * @param       array           $logArr: log data array
-        * @return      void     
+        * @return      void
         */
-       function devLog($logArr) {
+       public function devLog($logArr) {
                        // If the DB object is not yet instantiated or not connected to the DB, abort writing to the log
                if (!isset($GLOBALS['TYPO3_DB']) || !is_object($GLOBALS['TYPO3_DB']) || !$GLOBALS['TYPO3_DB']->link) {
                        return;
@@ -93,61 +88,60 @@ class tx_devlog {
                        $this->checkRowLimit();
                }
 
-               $insertFields = array();
-                       // Try to get a pid that makes sense
+               $logEntry = array();
+                       // Try to get a page id that makes sense
                $pid = 0;
                        // In the FE context, this is obviously the current page
-               if (isset($GLOBALS['TSFE'])) {
+               if (TYPO3_MODE == 'FE') {
                        $pid = $GLOBALS['TSFE']->id;
 
                        // In other contexts, a global variable may be set with a relevant pid
                } elseif (isset($GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['GLOBAL']['debugData']['pid'])) {
                        $pid = $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['GLOBAL']['debugData']['pid'];
                }
-               $insertFields['pid'] = $pid;
-               $insertFields['crdate'] = $GLOBALS['TYPO3_CONF_VARS']['EXTCONF'][$this->extKey]['tstamp'];
-               $insertFields['crmsec'] = $GLOBALS['TYPO3_CONF_VARS']['EXTCONF'][$this->extKey]['mstamp'];
-               $insertFields['cruser_id'] = $GLOBALS['BE_USER']->user['uid'];
-                       // Clean up the message before insertion into the database
-                       // If possible use RemoveXSS (TYPO3 4.2+), otherwise strip all tags
-               $message = '';
-               if (method_exists('t3lib_div', 'removeXSS')) {
-                       $message = t3lib_div::removeXSS($logArr['msg']);
-               } else {
-                       $message = strip_tags($logArr['msg']);
-               }
-               $insertFields['msg'] = $message;
+               $logEntry['pid'] = $pid;
+//             $logEntry['crdate'] = $GLOBALS['TYPO3_CONF_VARS']['EXTCONF'][$this->extKey]['tstamp'];
+               $logEntry['microtime'] = $GLOBALS['TYPO3_CONF_VARS']['EXTCONF'][$this->extKey]['mstamp'];
+               $logEntry['user'] = $GLOBALS['BE_USER']->user['uid'];
+               $logEntry['ip'] = t3lib_div::getIndpEnv('REMOTE_ADDR');
+
+                       // Clean up the message
+               $logEntry['message'] = t3lib_div::removeXSS($logArr['msg']);
                        // There's no reason to have any markup in the extension key
-               $insertFields['extkey'] = strip_tags($logArr['extKey']);
+               $logEntry['key'] = strip_tags($logArr['extKey']);
                        // Severity can only be a number
-               $insertFields['severity'] = intval($logArr['severity']);
+               $logEntry['severity'] = intval($logArr['severity']);
 
-                       // Try to get information about the place where this method was called from
-               if (function_exists('debug_backtrace')) {
-                       $callPlaceInfo = $this->getCallPlaceInfo(debug_backtrace());
-                       $insertFields['location'] = $callPlaceInfo['basename'];
-                       $insertFields['line'] = $callPlaceInfo['line'];
-               }
+                       // Get information about the place where this method was called from
+               $callPlaceInfo = $this->getCallPlaceInfo(debug_backtrace());
+               $logEntry['location'] = $callPlaceInfo['basename'];
+               $logEntry['line'] = $callPlaceInfo['line'];
 
                if (!empty($logArr['dataVar'])) {
+                       $extraData = $logArr['dataVar'];
                        if (is_array($logArr['dataVar'])) {
-                               $serializedData = serialize($logArr['dataVar']);
-                               if (!isset($this->extConf['dumpSize']) || strlen($serializedData) <= $this->extConf['dumpSize']) {
-                                       $insertFields['data_var'] = $serializedData;
-                               } else {
-                                       $insertFields['data_var'] = serialize(array('tx_devlog_error' => 'toolong'));
-                               }
+                               $extraData = array($logArr['dataVar']);
+                       }
+                       $serializedData = serialize($extraData);
+                       if (!isset($this->extConf['dumpSize']) || strlen($serializedData) <= $this->extConf['dumpSize']) {
+                               $logEntry['data'] = $serializedData;
                        } else {
-                               $insertFields['data_var'] = serialize(array('tx_devlog_error' => 'invalid'));
+                               $logEntry['data'] = serialize(array('tx_devlog_error' => 'toolong'));
                        }
                }
 
-               $GLOBALS['TYPO3_DB']->exec_INSERTquery('tx_devlog', $insertFields);
+               foreach ($GLOBALS['TYPO3_CONF_VARS']['EXTCONF'][$this->extKey]['writers'] as $class) {
+                       /** @var $writerObject tx_devlog_LogWriter */
+                       $writerObject = t3lib_div::makeInstance($class);
+                       if ($writerObject instanceof tx_devlog_LogWriter) {
+                               $writerObject->writeEntry($logEntry);
+                       }
+               }
 
                        // Increase the (cached) number of rows
                $this->numRows++;
        }
-       
+
        /**
         * Given a backtrace, this method tries to find the place where a "devLog" function was called
         * and return info about the place
@@ -156,7 +150,7 @@ class tx_devlog {
         *
         * @return      array   information about the call place
         */
-       function getCallPlaceInfo($backTrace) {
+       protected function getCallPlaceInfo($backTrace) {
                foreach ($backTrace as $entry) {
                        if ($entry['class'] !== 'tx_devlog' && $entry['function'] === 'devLog') {
                                $pathInfo = pathinfo($entry['file']);
@@ -170,10 +164,10 @@ class tx_devlog {
        /**
         * This method checks whether the number of rows in the devlog table exceeds the limit
         * If yes, 10% of that amount is deleted, with older records going first
-        * 
+        *
         * @return      void
         */
-       function checkRowLimit() {
+       protected function checkRowLimit() {
                        // Get the total number of rows, if not already defined
                if (!isset($this->numRows)) {
                        $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('COUNT(uid)', 'tx_devlog', '');
index 4caba52..834949b 100644 (file)
@@ -3,13 +3,12 @@ if (!defined ('TYPO3_MODE')) {
        die ('Access denied.');
 }
 
-// Load Devlog Classes
+       // Load Devlog Classes
 require_once(t3lib_extMgm::extPath('devlog', 'class.tx_devlog_exception.php'));
 
 
-// Define the timestamp for the current run
-// TODO: move to tx_devlog constructor (as static variables)
-
+       // Define the timestamp for the current run
+       // TODO: move to tx_devlog constructor (as static variables)
 if (!$TYPO3_CONF_VARS['EXTCONF'][$_EXTKEY]['mstamp']) {
        $parts = explode(' ', microtime());
                // Timestamp with microseconds to make sure 2 log runs can always be distinguished
@@ -20,13 +19,15 @@ if (!$TYPO3_CONF_VARS['EXTCONF'][$_EXTKEY]['mstamp']) {
        $TYPO3_CONF_VARS['EXTCONF'][$_EXTKEY]['tstamp'] = $parts[1];
 }
 
-// Register the logging method with the appropriate hook
-
+       // Register the logging method with the appropriate hook
 $TYPO3_CONF_VARS['SC_OPTIONS']['t3lib/class.t3lib_div.php']['devLog'][$_EXTKEY] = 'EXT:'.$_EXTKEY.'/class.tx_devlog.php:&tx_devlog->devLog';
 
-// @todo: choose one technique for loading data
-//$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['ExtDirect']['TYPO3.Devlog.Remote'] = 'EXT:devlog/class.tx_devlog_remote.php:tx_devlog_remote';
+       // @todo: choose one technique for loading data
+       //$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['ExtDirect']['TYPO3.Devlog.Remote'] = 'EXT:devlog/class.tx_devlog_remote.php:tx_devlog_remote';
 $TYPO3_CONF_VARS['BE']['AJAX']['LogController::indexAction'] = 'EXT:devlog/class.tx_devlog_remote.php:tx_devlog_remote->indexAction';
 $TYPO3_CONF_VARS['BE']['AJAX']['LogController::getDataVar'] = 'EXT:devlog/class.tx_devlog_remote.php:tx_devlog_remote->getDataVar';
 $TYPO3_CONF_VARS['BE']['AJAX']['LogController::getLastLogTime'] = 'EXT:devlog/class.tx_devlog_remote.php:tx_devlog_remote->getLastLogTime';
+
+       // Register log writers
+$TYPO3_CONF_VARS['EXTCONF'][$_EXTKEY]['writers']['db'] = 'tx_devlog_writers_Database';
 ?>
\ No newline at end of file
index 4fa8391..23b1e9d 100644 (file)
@@ -11,6 +11,7 @@ CREATE TABLE tx_devlog (
        extkey varchar(40) DEFAULT '' NOT NULL,
        msg text NOT NULL,
        location varchar(255) DEFAULT '' NOT NULL,
+       ip varchar(50) DEFAULT '' NOT NULL,
        line int(11) DEFAULT '0' NOT NULL,
        data_var mediumtext NOT NULL,
        
index 3a4e70d..72bce50 100644 (file)
@@ -20,8 +20,6 @@
 *  GNU General Public License for more details.
 *
 *  This copyright notice MUST APPEAR in all copies of the script!
-*
-*  $Id$
 ***************************************************************/
 
 
  * @author             Francois Suter <typo3@cobweb.ch>
  * @package            TYPO3
  * @subpackage tx_devlog
+ *
+ *  $Id$
  */
 interface tx_devlog_LogWriter {
        /**
         * This method is used to write a devLog entry to some support (database, file, etc.) or output
+        * It receives an array with the following information:
+        *
+        * pid =>               page where the call happened (if relevant, may be empty)
+        * severity =>  severity of the log entry
+        * message =>   main message of the log entry
+        * key =>               some key to identify the origin of the log entry (e.g. an extension's key)
+        * microtime => the microtime at which the entry happened (microtime is used to make sure we have different times for near-concurrent entries)
+        * location =>  the file where the call was triggered
+        * line =>              the line at which the call was triggered
+        * user =>              the BE user who was logged in at the time where the entry was written (may be empty)
+        * date =>              the timestamp at which the entry happened (less precise, but more usable than the microtime)
+        * ip =>                the IP address of the client machine which was making the request that triggered the entry
+        * data =>              additional information related to the entry, as a PHP array
         *
         * @abstract
-        * @param       string  $message: the main message to log
-        * @param       string  $key: some key that identifies in which context the log entry way issued (e.g. an extension key)
-        * @param       int             $severity: the severity of the log entry
-        * @param       array   $additionalData: addition information related to the log entry
+        * @param       array   $logEntry: addition information related to the log entry
         * @return void
         */
-       public function writeEntry($message, $key, $severity = 0, array $additionalData = array());
+       public function writeEntry($logEntry);
 }
 ?>
\ No newline at end of file
index 8e2756d..3c526ea 100644 (file)
 *  GNU General Public License for more details.
 *
 *  This copyright notice MUST APPEAR in all copies of the script!
-*
-*  $Id$
 ***************************************************************/
 
 
 /**
- * Interface that must be implemented for all classes that want to write devLog entries to some output system
+ * This class writes log entries to the database table "tx_devlog"
  *
  * @author             Francois Suter <typo3@cobweb.ch>
  * @package            TYPO3
  * @subpackage tx_devlog
+ *
+ *  $Id$
  */
 class tx_devlog_writers_Database implements tx_devlog_LogWriter {
        /**
-        * This method is used to write a devLog entry to some support (database, file, etc.) or output
+        * This method is used to write a devLog entry to the database
         *
-        * @abstract
-        * @param       string  $message: the main message to log
-        * @param       string  $key: some key that identifies in which context the log entry way issued (e.g. an extension key)
-        * @param       int             $severity: the severity of the log entry
-        * @param       array   $additionalData: addition information related to the log entry
+        * @param       array   $logEntry: addition information related to the log entry
         * @return void
         */
-       public function writeEntry($message, $key, $severity = 0, array $additionalData = array()) {
-
+       public function writeEntry($logEntry) {
+               $insertFields = array(
+                       'pid' => $logEntry['pid'],
+                       'crmsec' => $logEntry['microtime'],
+                       'crdate' => $GLOBALS['EXEC_TIME'],
+                       'cruser_id' => $logEntry['user'],
+                       'ip' => $logEntry['ip'],
+                       'severity' => $logEntry['severity'],
+                       'extkey' => $logEntry['key'],
+                       'msg' => $logEntry['message'],
+                       'location' => $logEntry['location'],
+                       'line' => $logEntry['line'],
+                       'data_var' => $logEntry['data']
+               );
+               $GLOBALS['TYPO3_DB']->exec_INSERTquery('tx_devlog', $insertFields);
        }
 }
 ?>
\ No newline at end of file