使用正确的时区登录 python

use*_*794 2 python logging

我想在 UpdateSubsStatus.log 文件中以正确的时区时间(欧洲/巴黎)写入日志...

这是我尝试过的,注释行是我厌倦的,但它不起作用。

import pytz

class Formatter(logging.Formatter):
    """override logging.Formatter to use an aware datetime object"""
    def converter(self, timestamp):
        dt = datetime.datetime.fromtimestamp(timestamp)
        tzinfo = pytz.timezone('America/Denver')
        return tzinfo.localize(dt)
        
    def formatTime(self, record, datefmt=None):
        dt = self.converter(record.created)
        if datefmt:
            s = dt.strftime(datefmt)
        else:
            try:
                s = dt.isoformat(timespec='milliseconds')
            except TypeError:
                s = dt.isoformat()
        return s
#console = logging.StreamHandler()
logging.basicConfig(filename='UpdateSubsStatus.log', filemode='a', format='%(asctime)s;%(name)s - %(levelname)s - %(message)s',datefmt='%Y-%m-%d %H:%M:%S')
#console.setFormatter(Formatter)
#logging.getLogger('').addHandler(console)
Run Code Online (Sandbox Code Playgroud)

是否存在一种通过基本配置使用时区的简单方法?

问候

Eug*_*nij 7

我尝试使用您的代码记录事件。事件记录在本地时区,而不是指定的时区。我认为问题出在这段代码上

def converter(self, timestamp):
    dt = datetime.datetime.fromtimestamp(timestamp)
    tzinfo = pytz.timezone('America/Denver')
    return tzinfo.localize(dt)
Run Code Online (Sandbox Code Playgroud)

此代码将时间戳转换为本地日期时间并更改 tzinfo,而无需真正的日期时间转换

>>> timestamp
1619258964.3946261
>>> dt = datetime.datetime.fromtimestamp(timestamp)
>>> dt
datetime.datetime(2021, 4, 24, 13, 9, 24, 394626)
>>> tzinfo = pytz.timezone('America/Denver')
>>> res = tzinfo.localize(dt)
>>> res
datetime.datetime(2021, 4, 24, 13, 9, 24, 394626, tzinfo=<DstTzInfo 'America/Denver' MDT-1 day, 18:00:00 DST>)
# Hours left unchanged
Run Code Online (Sandbox Code Playgroud)

所以我改变方法converter

def converter(self, timestamp):
    # Create datetime in UTC
    dt = datetime.datetime.fromtimestamp(timestamp, tz=pytz.UTC)
    # Change datetime's timezone 
    return dt.astimezone(pytz.timezone('America/Denver'))
Run Code Online (Sandbox Code Playgroud)

这是最终的代码

import pytz
import logging
import datetime


class Formatter(logging.Formatter):
    """override logging.Formatter to use an aware datetime object"""

    def converter(self, timestamp):
        # Create datetime in UTC
        dt = datetime.datetime.fromtimestamp(timestamp, tz=pytz.UTC)
        # Change datetime's timezone
        return dt.astimezone(pytz.timezone('America/Denver'))

    def formatTime(self, record, datefmt=None):
        dt = self.converter(record.created)
        if datefmt:
            s = dt.strftime(datefmt)
        else:
            try:
                s = dt.isoformat(timespec='milliseconds')
            except TypeError:
                s = dt.isoformat()
        return s


console = logging.FileHandler('UpdateSubsStatus.log')
console.setFormatter(Formatter(
    '%(asctime)s;%(name)s - %(levelname)s - %(message)s', '%Y-%m-%d %H:%M:%S'))
logging.getLogger('').addHandler(console)
logging.critical("Critical event")
Run Code Online (Sandbox Code Playgroud)

日志文件UpdateSubsStatus.log(仍然America/Denver是时区)

2021-04-24 04:19:16;root - CRITICAL - Critical event
2021-04-24 04:19:17;root - CRITICAL - Critical event
Run Code Online (Sandbox Code Playgroud)

另外,不要忘记将时区更改为Europe/Paris