您的位置:首页 > 其它

修改 logging 时间

2020-03-12 18:40 120 查看

文章同步发表在修改 logging 时间 · Lee’s Space Station

更新

  • 2019 年 12 月 19 日:增加 Docker 容器时间修改说明。

Docker 容器时间修改

如果你找的是如何修改 Docker 容器内的时间,那么你大概率不用往下看了。

解决方法很简单:设置

TZ
环境变量的值为
Asia/Shanghai
,在你的 Dockerfile 中增加如下命令即可:

ENV TZ Asia/Shanghai

如果发现还是不行,那么你需要先安装

tzdata

apt install tzdata

问题

在记录一些必要信息时,我通常会使用

logging
模块,在输出信息时同时可以输出时间和日志等级,例如使用
basicConfig
来先设定日志格式:

logging.basicConfig(format='%(asctime)s %(levelname)s: %(message)s',
level=logging.INFO,
datefmt='%Y-%m-%d %H:%M:%S')

假如说我们在中国,当前北京时间为 2019-01-06 17:30:11,那么正常情况下日志时间应该是也是这个,但是有些时候(比如在某些 docker 容器内)却是不正确的,例如会是下面的结果:

>>> logging.info("Hello")
2019-01-06 09:30:11 INFO: Hello

也就是说输出的日志时间比正确时间慢 8 个小时。

这是由于系统时间是错误的,或者说时区不正确,

logging
模块中
asctime
的时间使用的是
time.localtime()
返回的时间
,而
time.localtime()
又是使用的
time.time()
返回的时间
,而
time.time()
返回的是 UTC 时间,即从 1970-1-1 00:00:00 到现在的秒数,由于时区不对,所以没有转成中国所在的 UTC+8 时区。

解决

那么问题找到了,解决方法也很直接:为返回的时间加上 UTC 偏移

本文解决方法的前提是不能(不方便)修改系统时间。

吐槽一下,寻找解决办法过程中各种时间标准简直把我绕的不行,参见 GMT,UTC,DST,CST 各种时间标准

经过 SO 上这篇回答的提醒,可以设定

logging.Formatter.converter
来转换时间,但是回答里是转换成 GMT 时间,我们需要自己重写一个函数来加上 UTC 偏移,返回正确的时间,传给
logging.Formatter.converter

import logging
import datetime

def beijing(sec, what):
beijing_time = datetime.datetime.now() + datetime.timedelta(hours=8)
return beijing_time.timetuple()

logging.Formatter.converter = beijing

logging.basicConfig(
format="%(asctime)s %(levelname)s: %(message)s",
level=logging.INFO,
datefmt="%Y-%m-%d %H:%M:%S",
)

这样就可以将时间修正为正确的时间了。

END

  • 点赞 2
  • 收藏
  • 分享
  • 文章举报
secsilm 博客专家 发布了56 篇原创文章 · 获赞 467 · 访问量 108万+ 他的留言板 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: