Open-Source PHP Framework - Designed for rapid development of performance-oriented scalable applications

/webroot/js/tinymce/plugins/spellchecker/classes/utils/Logger.php

[return to app]
1
<?php
/**
 * $Id: Logger.class.php 10 2007-05-27 10:55:12Z spocke $
 *
 * @package MCFileManager.filesystems
 * @author Moxiecode
 * @copyright Copyright © 2005, Moxiecode Systems AB, All rights reserved.
 */

// File type contstants
define('MC_LOGGER_DEBUG', 0);
define('MC_LOGGER_INFO', 10);
define('MC_LOGGER_WARN', 20);
define('MC_LOGGER_ERROR', 30);
define('MC_LOGGER_FATAL', 40);

/**
 * Logging utility class. This class handles basic logging with levels, log rotation and custom log formats. It's
 * designed to be compact but still powerful and flexible.
 */
class Moxiecode_Logger {
    // Private fields
    var $_path;
    var $_filename;
    var $_maxSize;
    var $_maxFiles;
    var $_maxSizeBytes;
    var $_level;
    var $_format;

    /**
     * Constructs a new logger instance.
     */
    function Moxiecode_Logger() {
        $this->_path = "";
        $this->_filename = "{level}.log";
        $this->setMaxSize("100k");
        $this->_maxFiles = 10;
        $this->_level = MC_LOGGER_DEBUG;
        $this->_format = "[{time}] [{level}] {message}";
    }

    /**
     * Sets the current log level, use the MC_LOGGER constants.
     *
     * @param int $level Log level instance for example MC_LOGGER_DEBUG.
     */
    function setLevel($level) {
        if (is_string($level)) {
            switch (strtolower($level)) {
                case "debug":
                    $level = MC_LOGGER_DEBUG;
                    break;

                case "info":
                    $level = MC_LOGGER_INFO;
                    break;

                case "warn":
                case "warning":
                    $level = MC_LOGGER_WARN;
                    break;

                case "error":
                    $level = MC_LOGGER_ERROR;
                    break;

                case "fatal":
                    $level = MC_LOGGER_FATAL;
                    break;

                default:
                    $level = MC_LOGGER_FATAL;
            }
        }

        $this->_level = $level;
    }

    /**
     * Returns the current log level for example MC_LOGGER_DEBUG.
     *
     * @return int Current log level for example MC_LOGGER_DEBUG.
     */
    function getLevel() {
        return $this->_level;
    }

    function setPath($path) {
        $this->_path = $path;
    }

    function getPath() {
        return $this->_path;
    }

    function setFileName($file_name) {
        $this->_filename = $file_name;
    }

    function getFileName() {
        return $this->_filename;
    }

    function setFormat($format) {
        $this->_format = $format;
    }

    function getFormat() {
        return $this->_format;
    }

    function setMaxSize($size) {
        // Fix log max size
        $logMaxSizeBytes = intval(preg_replace("/[^0-9]/", "", $size));

        // Is KB
        if (strpos((strtolower($size)), "k") > 0)
            $logMaxSizeBytes *= 1024;

        // Is MB
        if (strpos((strtolower($size)), "m") > 0)
            $logMaxSizeBytes *= (1024 * 1024);

        $this->_maxSizeBytes = $logMaxSizeBytes;
        $this->_maxSize = $size;
    }

    function getMaxSize() {
        return $this->_maxSize;
    }

    function setMaxFiles($max_files) {
        $this->_maxFiles = $max_files;
    }

    function getMaxFiles() {
        return $this->_maxFiles;
    }

    function debug($msg) {
        $args = func_get_args();
        $this->_logMsg(MC_LOGGER_DEBUG, implode(', ', $args));
    }

    function info($msg) {
        $args = func_get_args();
        $this->_logMsg(MC_LOGGER_INFO, implode(', ', $args));
    }

    function warn($msg) {
        $args = func_get_args();
        $this->_logMsg(MC_LOGGER_WARN, implode(', ', $args));
    }

    function error($msg) {
        $args = func_get_args();
        $this->_logMsg(MC_LOGGER_ERROR, implode(', ', $args));
    }

    function fatal($msg) {
        $args = func_get_args();
        $this->_logMsg(MC_LOGGER_FATAL, implode(', ', $args));
    }

    function isDebugEnabled() {
        return $this->_level >= MC_LOGGER_DEBUG;
    }

    function isInfoEnabled() {
        return $this->_level >= MC_LOGGER_INFO;
    }

    function isWarnEnabled() {
        return $this->_level >= MC_LOGGER_WARN;
    }

    function isErrorEnabled() {
        return $this->_level >= MC_LOGGER_ERROR;
    }

    function isFatalEnabled() {
        return $this->_level >= MC_LOGGER_FATAL;
    }

    function _logMsg($level, $message) {
        $roll = false;

        if ($level < $this->_level)
            return;

        $logFile = $this->toOSPath($this->_path . "/" . $this->_filename);

        switch ($level) {
            case MC_LOGGER_DEBUG:
                $levelName = "DEBUG";
                break;

            case MC_LOGGER_INFO:
                $levelName = "INFO";
                break;

            case MC_LOGGER_WARN:
                $levelName = "WARN";
                break;

            case MC_LOGGER_ERROR:
                $levelName = "ERROR";
                break;

            case MC_LOGGER_FATAL:
                $levelName = "FATAL";
                break;
        }

        $logFile = str_replace('{level}', strtolower($levelName), $logFile);

        $text = $this->_format;
        $text = str_replace('{time}', date("Y-m-d H:i:s"), $text);
        $text = str_replace('{level}', strtolower($levelName), $text);
        $text = str_replace('{message}', $message, $text);
        $message = $text . "\r\n";

        // Check filesize
        if (file_exists($logFile)) {
            $size = @filesize($logFile);

            if ($size + strlen($message) > $this->_maxSizeBytes)
                $roll = true;
        }

        // Roll if the size is right
        if ($roll) {
            for ($i=$this->_maxFiles-1; $i>=1; $i--) {
                $rfile = $this->toOSPath($logFile . "." . $i);
                $nfile = $this->toOSPath($logFile . "." . ($i+1));

                if (@file_exists($rfile))
                    @rename($rfile, $nfile);
            }

            @rename($logFile, $this->toOSPath($logFile . ".1"));

            // Delete last logfile
            $delfile = $this->toOSPath($logFile . "." . ($this->_maxFiles + 1));
            if (@file_exists($delfile))
                @unlink($delfile);
        }

        // Append log line
        if (($fp = @fopen($logFile, "a")) != null) {
            @fputs($fp, $message);
            @fflush($fp);
            @fclose($fp);
        }
    }

    /**
     * Converts a Unix path to OS specific path.
     *
     * @param String $path Unix path to convert.
     */
    function toOSPath($path) {
        return str_replace("/", DIRECTORY_SEPARATOR, $path);
    }
}

?>