设置logging日志时间的时区
1.问题
最近我的几个python-bot项目都放在了replit上面白嫖运行,于是遇到了一个很让人头疼的问题。replit的终端采用的是UTC标准时间,比北京时间晚了8h,而我之前的项目,全都是用print来打印信息的(当时还不会用logging)
为了知道日志输出的时间,我在每一个print里面都调用了一个获取当前时间的函数
1 | def getTime(): |
这个函数会返回系统的当前时间。对于linux、windows这些时区正确的机器而言,输出的都是北京时间,没有什么问题。
如果你的linux机器(特别是用docker安装的)时区有问题,可以参考这篇文章来解决: 点我
但是到replit上面就不一样了,即便你在.replit
文件中添加了时区的环境变量,其依旧无法让localtime
返回北京时间
1 | TZ = "Asia/Shanghai" |
shell中输入date查看当前时间,依旧晚8h
我已经尝试过了,replit这个并不能像 linux修改时区 一样修改系统时间。
我们就只能从python下手来解决这个问题了
2.解决
首先是getTime
函数如和强制返回北京时间,我们需要将time改成使用datetime
1 | from datetime import datetime |
针对logging模块,也需要进行特殊处理
logging
模块中 asctime
的时间使用的是time.localtime()
返回的时间
文档:library/logging,library/time
而 time.localtime()
又是 ,使用的 time.time()
返回的时间,而 time.time()
返回的是 UTC 时间,即从 1970-1-1 00:00:00 到现在的秒数,由于时区不对,所以没有转成中国所在的 UTC+8 时区。
经过 stackoverflow 上这篇回答的提醒,可以设定 logging.Formatter.converter
来转换时间,但是回答里是转换成 GMT 时间,我们需要自己重写一个函数来加上 UTC 偏移,返回正确的时间,传给 logging.Formatter.converter
修改logging.Formatter.converter
1 | import logging |
还可以使用如下办法
1 | import logging |
两种办法都可以的!
3.验证
可以看到,修改之前,log输出的时间离正确的时间差8h
修改了之后,输出的时间就对了!
不过,修改这个也需要看你的项目面向的对象是谁。因为我写的都是kook平台的机器人,kook作为国内平台,压根没有几个歪果仁用,所以直接修改,将程序里面所有需要涉及到可读时间的都指定为北京时间。
如果你的项目是discord平台的机器人,那最好还是保留原状吧!
需要注意的是,时区的设置影响的是可读时间,即23-03-24 20:14:48
这样的时间;和时间戳并没有关系。
- 本文标题:【Python】设置logging日志时间的时区
- 创建时间:2023-03-24 20:21:00
- 本文链接:posts/1349268248/
- 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!