Yii2 - 如何在日志消息中设置时间?

Yii2 - How to set Time in Log messages?

我在 Yii2 中使用 EmailTarget 并且我正在记录这样的消息。

Yii::info('Log message example','mail');

执行成功后,我收到的邮件是这样的:

2018-07-31 09:01:12 [127.0.0.1][user@example.com][-][info][mail] Log message example

Yii2 默认生成日志消息并以 GMT 格式显示时间。

如何在这些日志消息中配置时间?

您可以创建一个从 yii\log\EmailTarget 扩展的新 class 并覆盖函数 formatMessage() 继承的形式 yii\Log\Target

Yii 2 Docs (log\Target) Github source

然后在您的配置中使用 class:

'components' => [
    'log' => [
         'targets' => [
             [
                'class' => 'your\namespace\CustomEmailTarget',
                'mailer' => 'mailer',
                'levels' => ['error', 'warning'],
                'message' => [
                    'from' => ['log@example.com'],
                    'to' => ['developer1@example.com', 'developer2@example.com'],
                    'subject' => 'Log message',
                ],
            ],
        ],
    ],
],

此日志目标使用 date() 进行日期格式设置,因此如果您使用错误的时区获取日期,则您的 PHP 中的时区设置可能不正确。您可以使用 date_default_timezone_set() 更改 date() 使用的时区,例如在您的配置中:

date_default_timezone_set('America/Los_Angeles');

另见 list of available timezones


如果您的日志目标应使用与应用程序其余部分不同的时区,您可以创建自定义目标并以这种方式覆盖 getTime()

protected function getTime($timestamp) {
    $oldTimezone = date_default_timezone_get();
    date_default_timezone_set('UTC'); // <- put your timezone here

    $parts = explode('.', StringHelper::floatToString($timestamp));
    $result = date('Y-m-d H:i:s', $parts[0]) . ($this->microtime && isset($parts[1]) ? ('.' . $parts[1]) : '');

    date_default_timezone_set($oldTimezone);
    return $result;
}