很多程序都有记录日志的需求,并且日志中包含的信息即有正常的程序访问日志,还可能有错误、警告等信息输出,python的logging模块提供了标准的日志接口,你可以通过它存储各种格式的日志,logging的日志可以分为 debug、info、warning、error、critical 5个级别,下面我们看一下怎么用
模块初识:
#logging初识
import logging
logging.warning(“user [james] attempted wrong password more than 3 times”)
logging.critical(“server is down”)
# warning:root:user [james] attempted wrong password more than 3 times
# critical:root:server is down
上面的代码是最简单的方式,括号里的内容为打印的信息,logging.后的方法为日志的级别,下面看看logging五个级别的详细信息
如果想把日志写到文件里,也很简单:
#日志打印到文件中
import logging
logging.basicconfig(filename=”example.log”,level=logging.info,
format=”%(asctime)s %(message)s”, datefmt=”%m/%d/%y %h:%m:%s [%a]”)
# h 24小时格式 i 12小时格式 a 周几完整 a 周几简写 p am/pm
logging.debug(“this message should go to the log file”)
logging.info(“so should this”)
logging.warning(“and this ,too”)
logging.basicconfig里定义了输入文件路径,输入日志信息的级别,输入的格式,格式可自定义;执行完代码后example.log文件会生成信息如下:
10/31/2016 17:16:17 [monday] so should this
10/31/2016 17:16:17 [monday] and this ,too
其中下面这句中的level=loggin.info意思是,把日志纪录级别设置为info,也就是说,只有比日志是info或比info级别更高的日志才会被纪录到文件里,在这个例子, 第一条日志是不会被纪录的,如果希望纪录debug的日志,那把日志级别改成debug就行了
如果想同时把log打印在屏幕和文件日志里,就需要了解一点复杂的知识了:
the logging library takes a modular approach and offers several categories of components: loggers, handlers, filters, and formatters.
loggers expose the interface that application code directly uses.
handlers send the log records (created by loggers) to the appropriate destination.
filters provide a finer grained facility for determining which log records to output.
formatters specify the layout of log records in the final output.
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#-author-lian
import logging
#创建logger
logger = logging.getlogger(“test_log”) #创建logger对象 括号内容随便写
logger.setlevel(logging.info) #全局日志级别
ch = logging.streamhandler() #日志打印到屏幕上
ch.setlevel(logging.debug) #指定ch日志打印级别
fh = logging.filehandler(“access.log”) #日志存进文件
fh.setlevel(logging.warning) #指定fh日志输入级别
formatter = logging.formatter(“%(asctime)s – %(name)s – %(levelname)s – %(message)s”) #定义日志格式,可写多个
#添加日志格式到ch,fh
ch.setformatter(formatter)
fh.setformatter(formatter)
#添加ch,fh到logger中
logger.addhandler(ch)
logger.addhandler(fh)
logger.debug(‘debug message’)
logger.info(‘info message’)
logger.warn(‘warn message’)
logger.error(‘error message’)
logger.critical(‘critical message’)
全局日志级别为整个程序的底线,局部日志级别要想打印则不能比这个级别再低了
屏幕打印信息
2016-10-31 17:23:42,988 – test_log – info – info message
2016-10-31 17:23:42,988 – test_log – warning – warn message
2016-10-31 17:23:42,988 – test_log – error – error message
2016-10-31 17:23:42,988 – test_log – critical – critical message
access.log:
2016-10-31 17:02:06,223 – test_log – warning – warn message
2016-10-31 17:02:06,224 – test_log – error – error message
2016-10-31 17:02:06,224 – test_log – critical – critical message
日志所有的格式:
重要的几个格式:%(lineno)d 输出打印日志代码行 ,%(process)d输出打印日志的进程id ,%(thread)d输出打印日志的线程id