日志属性asctime生成本地时间

use*_*717 4 python logging

我正在为我的项目使用日志记录,格式是

'format': '%(asctime)s %(message)s'

但是,时间不等于我当地的时间.例如

2013-01-08 11:04:07,383留言(这是UTC-6时间)

我想知道

  1. 如何使用我当地时间记录
  2. 如何将时间格式更改为2013-01-08 11:04:07

我修好了,问题是我需要在setting.py中设置时区!

aba*_*ert 8

来自文档:

class logging.Formatter(fmt = None,datefmt = None)

返回Formatter类的新实例.实例初始化为整个消息的格式字符串,以及消息的日期/时间部分的格式字符串.如果未指定fmt,则使用'%(message)s'.如果未指定datefmt,则使用ISO8601日期格式.

也:

如果格式化字符串包含'(asctime)',formatTime()则调用格式化事件时间.

因此,您可以使用自己的覆盖指定a datefmt或创建自定义Formatter子类formatTime.

而且,如果您想在当地时间和GMT时间(或其他任何时间)之间进行选择:

默认情况下,使用time.localtime(); 要为特定格式化程序实例更改此值,请将converter属性设置为与time.localtime()或time.gmtime()具有相同签名的函数.要为所有格式化程序更改它,例如,如果要在GMT中显示所有记录时间,请在Formatter类中设置converter属性.

formatdatefmt参数也可以传递给basicConfig,如果你不使用一个明确的,Formatter.你不能这样设置converter- 但你不必这样做,因为默认是本地时间.

所以:

logging.basicConfig(format='%(asctime)s %(message)s',
                    datefmt='%Y-%m-%d %H:%M:%S')
log = logging.getLogger(__name__)
log.error('Out of cheese!')
Run Code Online (Sandbox Code Playgroud)

我是在当地时间16:11:30运行的,输出结果如下:

2013-01-08 16:11:30 Out of cheese!
Run Code Online (Sandbox Code Playgroud)

实际上,看起来你要做的就是将标准时间格式的毫秒数减去,你可以通过截断字符串来做更简单的事情:

logging.basicConfig(format='%(asctime)-.19s %(message)s')
Run Code Online (Sandbox Code Playgroud)

但是,我认为明确指定日期格式更有意义.

  • @ user1687717:这可能意味着你在Django配置中指定的时区不同于系统的实际时区.考虑到他们获得的信息,他们都做了正确的事,但他们得到了相互矛盾的信息. (2认同)