Python logging: use milliseconds in time format

后端 未结 10 1724
不知归路
不知归路 2020-12-02 05:36

By default logging.Formatter(\'%(asctime)s\') prints with the following format:

2011-06-09 10:54:40,638

where 638 is the milli

相关标签:
10条回答
  • 2020-12-02 05:52

    tl;dr for folks looking here for an ISO formatted date:

    instead of using something like '%Y-%m-%d %H:%M:%S.%03d%z', create your own class as @unutbu indicated. Here's one for iso date format:

    import logging
    from time import gmtime, strftime
    
    class ISOFormatter(logging.Formatter):
        def formatTime(self, record, datefmt=None):
            t = strftime("%Y-%m-%dT%H:%M:%S", gmtime(record.created))
            z = strftime("%z",gmtime(record.created))
            s = "%s.%03d%s" % (t, record.msecs,z)        
            return s
    
    logger = logging.getLogger(__name__)
    logger.setLevel(logging.DEBUG)
    
    console = logging.StreamHandler()
    logger.addHandler(console)
    
    formatter = ISOFormatter(fmt='%(asctime)s - %(module)s - %(levelname)s - %(message)s')
    console.setFormatter(formatter)
    
    logger.debug('Jackdaws love my big sphinx of quartz.')
    #2020-10-23T17:25:48.310-0800 - <stdin> - DEBUG - Jackdaws love my big sphinx of quartz.
    
    
    0 讨论(0)
  • 2020-12-02 05:59

    Adding msecs was the better option, Thanks. Here is my amendment using this with Python 3.5.3 in Blender

    import logging
    logging.basicConfig(level=logging.DEBUG, format='%(asctime)s.%(msecs)03d %(levelname)s:\t%(message)s', datefmt='%Y-%m-%d %H:%M:%S')
    log = logging.getLogger(__name__)
    log.info("Logging Info")
    log.debug("Logging Debug")
    
    0 讨论(0)
  • 2020-12-02 05:59

    The simplest way I found was to override default_msec_format:

    formatter = logging.Formatter('%(asctime)s')
    formatter.default_msec_format = '%s.%03d'
    
    0 讨论(0)
  • 2020-12-02 06:03

    If you are using arrow or if you don't mind using arrow. You can substitute python's time formatting for arrow's one.

    import logging
    
    from arrow.arrow import Arrow
    
    
    class ArrowTimeFormatter(logging.Formatter):
    
        def formatTime(self, record, datefmt=None):
            arrow_time = Arrow.fromtimestamp(record.created)
    
            if datefmt:
                arrow_time = arrow_time.format(datefmt)
    
            return str(arrow_time)
    
    
    logger = logging.getLogger(__name__)
    
    default_handler = logging.StreamHandler()
    default_handler.setFormatter(ArrowTimeFormatter(
        fmt='%(asctime)s',
        datefmt='YYYY-MM-DD HH:mm:ss.SSS'
    ))
    
    logger.setLevel(logging.DEBUG)
    logger.addHandler(default_handler)
    

    Now you can use all of arrow's time formatting in datefmt attribute.

    0 讨论(0)
提交回复
热议问题