customize log filename of codeigniter log_message() customize log filename of codeigniter log_message() codeigniter codeigniter

customize log filename of codeigniter log_message()


log_message() function is common system function. Its using Log::write_log() method for logging error. Its not good hack the Core files. So you can extend Log library and overwrite write_log() function.

If you didnt extend your Log class yet. Create file application/libraries/MY_Log.php

class MY_Log extends CI_Log  {    function MY_Log ()    {        parent::__construct();        $this->ci =& get_instance();    }    public function write_log() { //here overriding        if ($this->_enabled === FALSE)        {        return FALSE;        }        $level = strtoupper($level);        if ( ! isset($this->_levels[$level]) OR        ($this->_levels[$level] > $this->_threshold))        {        return FALSE;        }        /* HERE YOUR LOG FILENAME YOU CAN CHANGE ITS NAME */        $filepath = $this->_log_path.'log-'.date('Y-m-d').EXT;        $message  = '';        if ( ! file_exists($filepath))        {        $message .= "<"."?php  if ( ! defined('BASEPATH'))        exit('No direct script access allowed'); ?".">\n\n";        }        if ( ! $fp = @fopen($filepath, FOPEN_WRITE_CREATE))        {        return FALSE;        }        $message .= $level.' '.(($level == 'INFO') ? ' -' : '-').' ';        $message .= date($this->_date_fmt). ' --> '.$msg."\n";        flock($fp, LOCK_EX);        fwrite($fp, $message);        flock($fp, LOCK_UN);        fclose($fp);        @chmod($filepath, FILE_WRITE_MODE);        return TRUE;    }}

Than log_message() function will work as your wish


@safarov's answer is great, but a little out of date in terms of specific code, here's how to make your own:

  • Create your MY_Log class as described by @safarov but don't overwrite the method yet.
  • Find the file which contains the CI_Log class, in CI 3.1.10 it's called Log.php and if you're using composer you'll probably find it at /vendor/codeigniter/framework/system/core/Log.php
  • In that file, find the write_log function and copy the whole thing into your new class.
  • Edit that function to name the file how you wish.
  • Don't forget to update this function when you update CI!


With CI 2.1.3 made it work using this code. Created MY_Log.php in libraries folder. Not exact what needed the OP but everybody will understand how to modyfy :)

<?php /** * CodeIgniter * * An open source application development framework for PHP 4.3.2 or newer * * @package        CodeIgniter * @author        ExpressionEngine Dev Team * @copyright    Copyright (c) 2006, EllisLab, Inc. * @license        http://codeigniter.com/user_guide/license.html * @link        http://codeigniter.com * @since        Version 1.0 * @filesource */// ------------------------------------------------------------------------/** * MY_Logging Class * * This library assumes that you have a config item called * $config['show_in_log'] = array(); * you can then create any error level you would like, using the following format * $config['show_in_log']= array('DEBUG','ERROR','INFO','SPECIAL','MY_ERROR_GROUP','ETC_GROUP');  * Setting the array to empty will log all error messages.  * Deleting this config item entirely will default to the standard * error loggin threshold config item.  * * @package        CodeIgniter * @subpackage    Libraries * @category    Logging * @author        ExpressionEngine Dev Team. Mod by Chris Newton */class MY_Log extends CI_Log {    /**     * Constructor     */    public function __construct()    {        $config =& get_config();        $this->_log_path = ($config['log_path'] != '') ? $config['log_path'] : APPPATH.'logs/';        if ( ! is_dir($this->_log_path) OR ! is_really_writable($this->_log_path))        {            $this->_enabled = FALSE;        }        if (is_numeric($config['log_threshold']))        {            $this->_threshold = $config['log_threshold'];        }        if ($config['log_date_format'] != '')        {            $this->_date_fmt = $config['log_date_format'];        }    }    private function isCommandLineInterface()    {        return (php_sapi_name() === 'cli');    }    // --------------------------------------------------------------------    /**     * Write Log File     *     * Generally this function will be called using the global log_message() function     *     * @access    public     * @param    string    the error level     * @param    string    the error message     * @param    bool    whether the error is a native PHP error     * @return    bool     */           public function write_log($level = 'error', $msg, $php_error = FALSE)    {        if ($this->_enabled === FALSE)        {            return FALSE;        }        $level = strtoupper($level);        if ( ! isset($this->_levels[$level]) OR ($this->_levels[$level] > $this->_threshold))        {            return FALSE;        }        $filepath = $this->_log_path.'log-'.date('Y-m-d').'.php';        $message  = '';        if ( ! file_exists($filepath))        {            $message .= "<"."?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed'); ?".">\n\n";        }        if ( ! $fp = @fopen($filepath, FOPEN_WRITE_CREATE))        {            return FALSE;        }        if ($this->isCommandLineInterface()) {            $message .= 'CMD ';        }        $message .= $level.' '.(($level == 'INFO') ? ' -' : '-').' '.date($this->_date_fmt). ' --> '.$msg."\n";        flock($fp, LOCK_EX);        fwrite($fp, $message);        flock($fp, LOCK_UN);        fclose($fp);        @chmod($filepath, FILE_WRITE_MODE);        return TRUE;    }}