【问题标题】:How to set timestamps on GMT/UTC on Python logging?如何在 Python 日志记录中设置 GMT/UTC 时间戳?
【发布时间】:2011-09-13 08:25:24
【问题描述】:

是否可以以及如何将日志记录时区设置为 GMT?

(即格式中的%(asctime)s参数)

【问题讨论】:

    标签: python logging timezone utc


    【解决方案1】:
    logging.Formatter.converter = time.gmtime
    

    (记录在logging.Formatter.formatTime的文档字符串中)

    【讨论】:

    • 我现在还更新了官方 HTML 文档 - 3.2 和 3.3 应该很快就会出现,2.7 应该会在几天后出现。
    • 描述为here。如果要将格式化程序附加到处理程序,首先需要使用 formatter = logging.Formatter(fmt) 创建一个格式化程序,然后执行 formatter.converter = time.gmtime ,然后是 myHandler.setFormatter(formatter)
    • @VinaySajip 如何在日志记录 dictConfig 中设置它?我使用 Django,它使用 logging.dictConfig 来配置日志记录部分。谢谢
    • @YAmikep 查看 rakslice 的答案,了解一种方法。
    • @ivanleoncz 设置 logging.Formatter.converter = time.gmtime 将适用于从 logging.Formatter 类继承的任何格式化程序。只需检查 Django 格式化程序是否继承自 Python 的主 Formatter 类,我敢打赌。
    【解决方案2】:

    在 Python 2.5 中仅设置 logging.Formatter.converter = time.gmtime 对我来说是无效的。

    所以我创建了一个设置它的子类,并使用它来代替 logging.Formatter:

    class UTCFormatter(logging.Formatter):
        converter = time.gmtime
    

    【讨论】:

    • 在 Python 2.7 中为我工作。添加了显示用于实例化的 YAML 语法的建议编辑,因为它有点棘手。 (正如我的第一次编辑建议的那样,不需要__init__() 方法。)
    【解决方案3】:

    来自 python 3 文档:

    import time
    
    class UTCFormatter(logging.Formatter):
        converter = time.gmtime
    

    https://docs.python.org/3/howto/logging-cookbook.html#formatting-times-using-utc-gmt-via-configuration

    【讨论】:

      【解决方案4】:

      这里是代码示例:

      import logging, logging.handlers
      import time
      
      logit = logging.getLogger('logit')
      handler = logging.handlers.RotatingFileHandler("file.log", maxBytes=20000, backupCount=5)
      handler.setLevel(logging.INFO)
      formatter = logging.Formatter('%(asctime)s %(levelname)8s: %(message)s')
      handler.setFormatter(formatter)
      logging.Formatter.converter = time.gmtime
      logit.addHandler(handler)
      
      logit.info("test log message")
      

      输出:

      2019-11-14 16:34:22,967     INFO: test log message
      

      【讨论】:

        【解决方案5】:

        这行得通:

        os.environ['TZ'] = 'UTC'
        time.tzset()
        

        但确实会改变整个流程和任何子流程的 TZ 环境。不一定是坏事,但在这样做之前需要注意一些事情。

        或者,如果您在运行 python 之前从外部设置 TZ 环境变量(无论是在任何运行 python 的环境中,还是在整个系统级别),这也可以。

        【讨论】:

          【解决方案6】:

          我对这两个答案都有疑问。所以我只是更改了整个脚本的全球时区:

          os.environ['TZ'] = 'Europe/London'
          time.tzset()
          

          【讨论】:

          • 要小心,因为伦敦在夏季不是格林威治标准时间。
          • 我发现这是可行的答案,在 Linux 上使用 Python 2.7。值得使用 Linux tzselect 命令检查您指定的任何内容都是系统上的有效时区,并使用“date”命令在 Python 之外进行测试。 Django 似乎可以为其设置处理这个问题,但是在从非 Django Python 脚本进行 Python 日志记录时,我得到了错误的时区。
          • 这是不正确的!伦敦的时区不能保证永远是 UTC。
          • 这是一种有趣的方法,但是这会改变整个过程的时区,这可能会产生一些不需要的副作用,比如如果您只想更改显示时间的时区,而不是其他东西。
          猜你喜欢
          • 2015-09-25
          • 2023-03-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-10-05
          • 1970-01-01
          • 2012-01-12
          相关资源
          最近更新 更多