Pyhton中logging的使用方法

在讲解之前,先复习一些在Python中小知识,还是以代码的形式说明:

>>> import time 
>>> time.time() # time.time()  用于获取时间戳,1970年以前的无法获取。
1512545439.814
>>> time.localtime(time.time()) # time.localtime(time.time()) 从返回浮点数的时间戳方式向时间元组转换
time.struct_time(tm_year=2017, tm_mon=12, tm_mday=6, tm_hour=15, tm_min=30, tm_sec=59, tm_wday=2, tm_yday=340, tm_isdst=0)
>>> time.localtime() # time.localtime()本身返回的是当前时间元组
time.struct_time(tm_year=2017, tm_mon=12, tm_mday=6, tm_hour=15, tm_min=43, tm_sec=56, tm_wday=2, tm_yday=340, tm_isdst=0)
>>> time.strftime("%Y%m%d-%H%M%S", time.localtime(time.time())) # 将时间元组格式化输出
'20171206-153130'
>>> time.strftime("%Y%m%d-%H%M%S", time.localtime())
'20171206-153426'
#其中python中时间日期格式化符号:
#   %y 两位数的年份表示(00-99)
#   %Y 四位数的年份表示(000-9999)
#   %m 月份(01-12)
#   %d 月内中的一天(0-31)
#   %H 24小时制小时数(0-23)
#   %M 分钟数(00=59)
#   %S 秒(00-59)

>>> time.asctime(time.localtime())  #  返回一个可读的形式为"Tue Dec 11 18:07:14 2008"(2008年12月11日 周二18时07分14秒)的24个字符的字符串
'Wed Dec 06 15:53:22 2017'
>>> time.asctime() # 参数为空,或者一个表示时间的元组,例如time.localtime()返回的值就是一个时间元组
'Wed Dec 06 15:53:42 2017'

下面来介绍一下logging的基本用法

在代码中创建logging的基本步骤:

1、导入日志模块 import logging

2、 创建一个logger logger=logging.getLogger(“myFristlogger”)

3、设置logger的等级 logger.setLevel(logging.DEBUG)

4、创建一个handler用于写入日志文件 fh=logging.FileHander(“E/code/first.log”)

5、定义handler的输出格式 formatter=logging.Formatter(‘%(asctime)s-%(name)s-%(module)s-%(funcName)s-%(message)s’)

6、给logger添加handler logger.addHandler(fh)

7、在其他模块想要输出信息到日志信息时,在模块中import logging ,然后logger.info(“这是日志输出的info级别的信息”),其他的还有如:

import logging
logger.debug("foobar")     
logger.info("foobar")         
logger.warning("foobar")    
logger.error("foobar")      
logger.critical("foobar")  

下面给出一个网上的具体的例子,感受一下:

import logging
# 创建一个logger
logger = logging.getLogger('mylogger')
logger.setLevel(logging.INFO)   
# 创建一个handler,用于写入日志文件
fh = logging.FileHandler('test.log')
fh.setLevel(logging.INFO)   
# 再创建一个handler,用于输出到控制台
ch = logging.StreamHandler()
ch.setLevel(logging.INFO)
# 定义handler的输出格式
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
fh.setFormatter(formatter)
ch.setFormatter(formatter)
# 给logger添加handler
logger.addHandler(fh)
logger.addHandler(ch)
# 记录一条日志
logger.info('foorbar')
logger.debug("foobar")    # 不输出   
logger.info("foobar")        # 输出  
logger.warning("foobar")  # 输出  
logger.error("foobar")      # 输出  
logger.critical("foobar")    # 输出  

注意事项:
logging.getLogger([name])

  返回一个logger实例,如果没有指定name,返回root logger。只要name相同,返回的logger实例都是同一个而且只有一个,即name和logger实例是一一对应的。这意味着,无需把logger实例在各个模块中传递。只要知道name,就能得到同一个logger实例。
  
Logger.setLevel(level)

  设置logger的level, level有以下几个级别: 
  级别高低顺序:NOTSET < DEBUG < INFO < WARNING < ERROR < CRITICAL

Logger.addHandler(hdlr)

通过handler对象可以把日志内容写到不同的地方。比如简单的StreamHandler就是把日志写到类似文件的地方。python提供了十几种实用handler,比较常用有

    # StreamHandler: 输出到控制台
    # FileHandler:   输出到文件
    # BaseRotatingHandler 可以按时间写入到不同的日志中。比如将日志按天写入不同的日期结尾的文件文件。   

logging.basicConfig([**kwargs])

这个函数用来配置root logger, 为root logger创建一个StreamHandler,设置默认的格式。*这些函数: logging.debug()、logging.info()、logging.warning()、logging.error()、logging.critical() 如果调用的时候发现root logger没有任何handler,会自动调用basicConfig添加一个handler 如果root logger已有handler,这个函数不做任何事情使用basicConfig来配置root logger的输出格式和level:

   import logging
   from logging.handlers import TimedRotatingFileHandler
   logging.basicConfig(format="[ %(asctime)s][%(module)s.%(funcName)s] %(message)s") 
    logging.debug("I have no hanndler,but basicConfig will config a handler for me ,and the seted output format and logging level ")

logging.Formatter()函数的取值可以有但不限于一下几种

Pyhton中logging的使用方法

又到了总结的时候啦!!好开心,写完这个去吃饭饭!

logger对象直接提供日志接口。handler 把日志写到不同的地方,formatter描述日志的格式。从最简单的formatter对象来看。formatter指定的是每一条日志记录的抬头信息,也就是你可以指定日志记录的时间格式、进程号、文件名、函数名等信息。

其他信息可以参考博客:http://www.jb51.net/article/42626.htm
python中的logger详解

;