Logging
import logging
Quick Start
After importing logging
, just use logging.waring()
or logging.error()
directly. The default level for logging is DEBUG
, so warring information will be printed. info
have lower level than DEBUG
and thus will not be printed.
If not configured and logging
will print information to stdout like screen.
#!/usr/local/bin/python
# -*- coding:utf-8 -*-
import logging
logging.warning('Watch out!') # print message to console
logging.info('I told you so') # will not print anything
Log
to file
It’s more common to log all the information to a log file. And it’s necessary to use logging.basicConfig()
to specify params like level
etc.
Level | Value |
---|---|
CRITICAL | 50 |
ERROR | 40 |
WARNING | 30 |
INFO | 20 |
DEBUG | 10 |
If you set level to INFO
then DEBUG
level information will not be printed. Common API like debug()
, info()
, warning()
, error()
and critical()
corrospond to different levels of log.
Note that write the code below into a python file like test_log.py. If you put it directly in ide, there will not be log file generated.
import logging
logging.basicConfig(filename='example.log',level=logging.DEBUG,filemode='w')
logging.debug('This message should go to the log file')
logging.info('So should this')
logging.warning('And this, too')
cat example.log
DEBUG:root:This message should go to the log file
INFO:root:So should this
WARNING:root:And this, too
Change format of Log
Use format
to configure the format of logging information.
import logging
logging.basicConfig(format='%(levelname)s:%(message)s',level=logging.DEBUG)
logging.debug('This message should appear on the console')
logging.info('So should this')
logging.warning('And this, too')
DEBUG:This message should appear on the console
INFO:So should this
WARNING:And this, too
Log time
Use datafmt
param to change the format of logging time.
import logging
logging.basicConfig(format='%(asctime)s %(message)s',datefmt='%m/%d/%Y %I:%M:%S %p')
logging.warning('is when this event was logged.')
07/16/2016 12:10:35 AM is when this event was logged.
More control over Log
So far, we only use default configuration. In fact we have more control over how information should be logged. For example, output log information to stdout and log file.
A simple understanding of several concepts are useful.
Logger
Handler
sent log information to destinationFilter
can filter out some logFormatter
better control over formating
First, create a logger, and add some handlers to it, and output to different places, like file log.txt or stdout.
import logging
# create logger with name
# if not specified, it will be root
logger = logging.getLogger('my_logger')
logger.setLevel(logging.DEBUG)
# create a handler, write to log.txt
# logging.FileHandler(self, filename, mode='a', encoding=None, delay=0)
# A handler class which writes formatted logging records to disk files.
fh = logging.FileHandler('log.txt')
fh.setLevel(logging.DEBUG)
# create another handler, for stdout in terminal
# A handler class which writes logging records to a stream
sh = logging.StreamHandler()
sh.setLevel(logging.DEBUG)
# set formatter
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
fh.setFormatter(formatter)
sh.setFormatter(formatter)
# add handler to logger
logger.addHandler(fh)
logger.addHandler(sh)
# log it
logger.debug('Debug')
logger.info('Info')
2016-07-18 21:43:14,648 - my_logger - DEBUG - Debug
2016-07-18 21:43:14,650 - my_logger - INFO - Info