前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >修改 logging 时间

修改 logging 时间

作者头像
Alan Lee
发布2019-05-28 12:04:04
1.5K0
发布2019-05-28 12:04:04
举报
文章被收录于专栏:Small CodeSmall Code

版权声明:本文为博主原创文章,未经授权禁止转载。 https://cloud.tencent.com/developer/article/1436926

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

问题

在记录一些必要信息时,我通常会使用 logging 模块,在输出信息时同时可以输出时间和日志等级,例如使用 basicConfig 来先设定日志格式:

代码语言:javascript
复制
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 容器内)却是不正确的,例如会是下面的结果:

代码语言:javascript
复制
>>> 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

代码语言:javascript
复制
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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019年01月06日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 问题
  • 解决
  • END
相关产品与服务
日志服务
日志服务(Cloud Log Service,CLS)是腾讯云提供的一站式日志服务平台,提供了从日志采集、日志存储到日志检索,图表分析、监控告警、日志投递等多项服务,协助用户通过日志来解决业务运维、服务监控、日志审计等场景问题。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档