Микросекунды в Yii Framework application.log
9 июля 2012 г.

Как добавить вывод микросекунд в файл application.log (стандартный лог в Yii Framework)?

Вот так выглядит конфиг с включенными логами

'preload' => array(
'log',
),
'components' => array(
'log' => array(
    'class' => 'CLogRouter',
    'routes' => array(
        array(
            'class' => 'CFileLogRoute',
            'levels' => 'warning, error, profile',
        ),
    ),
),
)
//... end main config

А вот так выглядит application.log:

2012/06/25 15:25:32 [error] [system.db.CDbCommand] CDbCommand::fetchAll() failed: SQLSTATE[42S02]
2012/07/06 12:57:33 [profile] [application] begin:posts with limit and offset
2012/07/06 12:57:38 [profile] [application] end:posts with limit and offset

Как видно выше, во временных метках стоят секунды, но что если важна точность до каждой доли секунды, в идеале это должно быть отображение милисекунд. Например, при оптимизации какой-то части кода и профилировании её в этот самый лог.

Чтобы изменить и расширить вывод в application.log, можно создать небольшой extension унаследовавшись от CFileLogRoute Назовем файл ExtendedLogger.php

class ExtendedLogger extends CFileLogRoute
{
    protected function formatLogMessage($message,$level,$category,$time)
    {
        $micro = sprintf("%06d",($time - floor($time)) * 1000000);
        return date('Y-m-d H:i:s.'.$micro,$time)." [$level] [$category] $message\n";
    }
}

Как видно в нем переопределен метод formatLogMessage, в который добавлены микросекунды. Далее поместим ExtendedLogger.php в extensions/ExtendedLogger/ExtendedLogger.php и изменим конфиг на следующий:

    'preload' => array(
        'log',
    ),
    'components' => array(
        'log' => array(
            'class' => 'CLogRouter',
            'routes' => array(
                array(
                    'class' => 'CFileLogRoute',
                    'levels' => 'warning, error',
                ),
                array(
                    'class' => 'application.extensions.ExtendedLogger.ExtendedLogger',
                    'levels' => 'profile',
                ),
            ),
        ),
    )

И теперь application.log становится вот таким:

2012/07/05 19:52:32.707493 [profile] [application] begin:getPostsByUserId without cache
2012/07/05 19:52:33.775888 [profile] [application] end:getPostsByUserId without cache
Последнее обновление 9 мая 2021 г.
Development php yii yii framework