修改 logging 时间
2020-03-12 18:40
120 查看
更新
- 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
- 收藏
- 分享
- 文章举报
相关文章推荐
- 【推荐】PHP中格式化时间函数date与gmdate的区别 | 修改PHP的默认时区
- 【推荐】PHP中格式化时间函数date与gmdate的区别 | 修改PHP的默认时区
- 在vs2005里怎么调试 js--修改时间2007/9/3
- dedeCms批量修改文章发布时间的方法
- linux修改时间和日期.查看修改硬件时间.
- Android 修改系统默认时间为24小时格式
- 如何修改系统默认时间
- 时间类 修改thinkphp5,自己增加了一些
- 规范HTML代码可以节省修改代码的时间
- java 修改session默认时间
- 文件时间戳修改touch和查看stat和ls --time
- CTS-Verifier 设置灭屏时间不同步 修改
- linux 修改时间
- 在Linux下,一个文件也有三种时间,分别是:访问时间、修改时间、状态改动时间
- delphi 一个修改系统时间的函数,超简单
- 修改volley默认超时时间以及重连次数
- linux下如何修改系统时间
- hdu 2079 选课时间(题目已修改,注意读题) (母函数)
- linux下文件的访问时间、修改时间和改变时间
- 修改全志A10 RTC 默认时间