滚滚向前滚

导航

 

目录

一、学习链接

http://www.cnblogs.com/dkblog/archive/2011/08/26/2155018.html

http://www.jb51.net/article/63502.htm

二、logging模块四大基本概念

2.1 logger

创建一个对象,调用logging模块的方法来答应日志

2.2 handler

控制日志打印的位置

2.3 filter

2.4 formatter

控制日志打印格式

三、 基本使用

3.1 引入日志模块

import logging

3.2 简单打印日志

默认情况下只打印warning及以上级别的日志

import logging

logging.debug('This is debug message')
logging.error('This is error message')
logging.info('This is info message')
logging.warning('This is warning message')
logging.critical('This is critical message')

简单日志打印结果

四、实际场景应用推导

4.1 打印日志到文件:basicConfig()方法

import logging
# 日志打印到test.log文件中,日志打印级别为DEBUG(默认日志打印方式是a)
logging.basicConfig(filename='test.log', level=logging.DEBUG)

logging.debug('This is debug message')
logging.error('This is error message')
logging.info('This is info message')
logging.warning('This is warning message')
logging.critical('This is critical message')

日志打印到指定位置

4.1.1 basicConfig参数详解

filename: 指定日志文件名
filemode: 和file函数意义相同,指定日志文件的打开模式,'w'或'a'
format: 指定输出的格式和内容,format可以输出很多有用信息(和formatter组件的参数一致)
datefmt: 指定时间格式,同time.strftime()
level: 设置日志级别,默认为logging.WARNING
stream: 指定将日志的输出流,可以指定输出到sys.stderr,sys.stdout或者文件,默认输出到sys.stderr,当stream和filename同时指定时,stream被忽略

4.2 结合logger、handler以及formatter打印日志

import logging
# 日志文件位置
log_type = 'test_info.log'

log_level = logging.DEBUG
logger = logging.getLogger()
logger.setLevel(log_level)

# 日志打印到文件中

# 设置日志文件路径
log_file = "%s/logs/%s" %(settings.BASE_DIR, log_type)
fh = logging.FileHandler(log_file)
fh.setLevel(log_level)

# 设置日志文件格式
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - lineno:%(lineno)d - %(message)s')

# 将日志文件格式设置到fh中
fh.setFormatter(formatter)

# 将句柄添加至logger
logger.addHandler(fh)

logger.debug('This is debug message')
logger.error('This is error message')
logger.info('This is info message')
logger.warning('This is warning message')
logger.critical('This is critical message')

结果

4.3 日志打印模块封装

4.3.1 日志封装代码展示

import logging
from config import settings

def Logger(log_type):
    '''
    打印日志类
    :param log_type:
    :return:
    '''
    #create logger
    logger = logging.getLogger(log_type)
    logger.setLevel(settings.LOG_LEVEL)

    # 日志打印到控制台
    # create console handler and set level to debug
    # ch = logging.StreamHandler()
    # ch.setLevel(log_level)

    # create file handler and set level to warning
    log_file = "%s/logs/%s" %(settings.BASE_DIR, settings.LOG_TYPES[log_type])
    fh = logging.FileHandler(log_file, encoding='utf-8', mode='a') # 指定打印日志格式为utf-8解决乱码问题,默认情况mode也是a
    fh.setLevel(settings.LOG_LEVEL)
    # create formatter
    formatter = logging.Formatter(
        fmt = '%(asctime)s - %(name)s -%(threadName)s:%(process)d - %(filename)s:%(lineno)d - %(message)s',
        datefmt = '%Y-%m-%d %A %H:%M:%S', # 格式化日期输出
    )

    # add formatter to ch and fh
    # ch.setFormatter(formatter)
    fh.setFormatter(formatter)

    # add ch and fh to logger
    # logger.addHandler(ch)
    logger.addHandler(fh)

    return logger

4.3.2 调用日志模块示例

logger = Logger("INFO")
logger.debug("测试数据")
logger.info("测试数据")
logger.error("测试数据")
logger.critical("测试数据")
logger.warning("测试数据")

打印日志展示

五、补充

5.1 formatter格式化日志展示字段列表

%(levelno)s: 打印日志级别的数值
%(levelname)s: 打印日志级别名称
%(pathname)s: 打印当前执行程序的路径,其实就是sys.argv[0]
%(filename)s: 打印当前执行程序名
%(funcName)s: 打印日志的当前函数
%(lineno)d: 打印日志的当前行号
%(asctime)s: 打印日志的时间
%(thread)d: 打印线程ID
%(threadName)s: 打印线程名称
%(process)d: 打印进程ID
%(message)s: 打印日志信息
posted on 2018-04-23 14:40  滚滚向前滚  阅读(204)  评论(0编辑  收藏  举报