用配置文件,修改linux系统下的时区(所用系统 CentOS8)
1.问题来源 在linux上使用python的logging模块的时候,发现了一个问题,那就是模块里面的%(asctime)s
打印的时间并非东八区的时间,而是格林尼治时间,比东八区的时间少了8小时
对于日志来说,这怎么行?总不能每次看日志的时候,自己手动给时间加8小时吧!那样对debug来说可不是什么方便事!
2.解决 百度了一下后,发现是我系统的时区问题。这个Centos系统是用docker安装的,内部的时区没有正常设置
通过date命令可以查看系统当前的时间
1 Sat Mar 4 01:29:59 UTC 2023
会发现是3月4日的凌晨1点,但实际上我是在上午9点写下的这篇博客
这就需要我们修改时区了!
刚开始,我尝试用tzselect
命令进行时区的选择,再选择了上海时区后,系统的时间还是有问题。然后发现,需要修改文件配置,才能让时间生效
1 2 3 /etc/timezone /etc/localtime /usr/share/zoneinfo/Asia
而我的系统中,第一个文件压根不存在!
要用下面的两个命令来修改配置文件(root下执行)
1 echo "Asia/Shanghai" > /etc/timezone
1 2 rm -rf /etc/localtimeln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
修改完毕,再次执行date
命令,可以看到时间已经正常了
1 Sat Mar 4 09:31:33 CST 2023
python的logging模块中打印的时间也正常了
1 2 3 4 5 6 [23-03-04 09:31:39] DEBUG:log.py:debug:9 | test in main [23-03-04 09:31:39] ERROR:log.py:exception:24 | Exception occurred Traceback (most recent call last): File "/home/kook/code/py-test/log.py", line 32, in test a = 10/0 ZeroDivisionError: division by zero
3.python-logging优化 虽然如此,但logging本身其实是可以设置时区的,提供一份简单的模板代码;
在下面的代码中,用了beijing
这个函数来获取东八区的时间,这样这份代码在任何系统上执行,都将会打印东八区的时间了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 import loggingfrom datetime import datetime,timezone,timedeltaLOGGER_NAME = "bot-log" LOGGER_FILE = "bot.log" """日志文件路径""" def beijing (sec, what ): """日志返回北京时间的处理""" utc_dt = datetime.now(timezone.utc) beijing_time = utc_dt.astimezone(timezone(timedelta(hours=8 ))) return beijing_time.timetuple() logging.Formatter.converter = beijing logging.basicConfig(level=logging.INFO, format ="[%(asctime)s] %(levelname)s:%(filename)s:%(funcName)s:%(lineno)d | %(message)s" , datefmt="%y-%m-%d %H:%M:%S" ) _log = logging.getLogger(LOGGER_NAME) """自定义的logger对象""" file_handler = logging.FileHandler(LOGGER_FILE, mode="a" , encoding="utf-8" ) fmt = logging.Formatter(fmt="[%(asctime)s] %(levelname)s:%(filename)s:%(funcName)s:%(lineno)d | %(message)s" , datefmt="%y-%m-%d %H:%M:%S" ) file_handler.setFormatter(fmt) _log.addHandler(file_handler)
针对replit
这类不支持自定义时区 的平台,这样也更方便。