basicConfig方法

bashicConfig方法使用logging是比较简单方便的方法;
分两步:

  1. 申请logger;
    logging.basicConfig(level = logging.DEBUG,format = '[%(asctime)s]%(name)s:%(levelname)s:%(message)s'
  2. 使用logger;
#message为需要输出的信息,该信息为格式化字符串的方式输出。
logging.debug(message)
3. 测试代码
def test_basicConfig():
    '''
    测试basicConfig方法对logging进行配置,该方法满足大多数场景的使用需求
    '''
    logging.basicConfig(level = logging.DEBUG,format = '[%(asctime)s]%(name)s:%(levelname)s:%(message)s'
                        )
    for i in range(10):
        logging.debug(i)

标准logging使用方法

  • 创建logger实例,设置logger级别,创建logger输出格式
logger = logging.getLogger(name)
    logger.setLevel(logging.DEBUG)
    formatter = logging.Formatter('[%(asctime)s] %(name)s:' '%(levelname)s: %(message)s')
  • 创建输出handler

创建输出到控制台的stremhandler;创建输出到文件的filehandler;

hdr = logging.StreamHandler()
    fhr = logging.FileHandler('filelog.log')
  • 给两个handler设置格式
    设置streamhandler的输出格式;设置filehandler的输出格式
hdr.setFormatter(formatter)
    fhr.setFormatter(formatter)
  • 将两个handler增加到logger
logger.addHandler(hdr)
    logger.addHandler(fhr)
  • logger的使用
    logger使用级别为info;logger使用级别为debug
logger.info(message) #massage为带输出的信息
logger.debug(message)

自定义的logging函数,可以直接调用

  • 函数
def my_log(name):
    '''
    :param name: 申请logger的名字
    :return:申请号的logger

    函数用来申请logger,同时返回申请的logger;
    申请logger:logger_name = test_logging.my_log('name')
    调用logger:logger_name.debug('mylog test b: %d'%(b))
    '''
    logger = logging.getLogger(name)
    logger.setLevel(logging.DEBUG)
    formatter = logging.Formatter('[%(asctime)s] %(name)s: %(levelname)s: %(message)s')
    #输出到控制台
    hd = logging.StreamHandler()
    hd.setFormatter(formatter)
    #输出到文本
    fh = logging.FileHandler('logfile.log')
    fh.setFormatter(formatter)
    #增加handler
    logger.addHandler(fh)
    logger.addHandler(hd)

    return logger
  • 函数的使用
import test_logging

#logger申请,注意如果放在循环中,会创建多个logger

logger_logb = test_logging.my_log('logb')
logger_logi = test_logging.my_log('logi')
for i in range(10):
    a = 0
    b = a + i

    #logger的使用
    logger_logb.debug('mylog test b: %d'%(b))
    logger_logi.info('mylog test i: %d'%(i))

自定义logging类,使用代码更简单

class Logger():
    def __init__(self, logname, loglevel, logger):
        '''
           指定保存日志的文件路径,日志级别,以及调用文件
           将日志存入到指定的文件中
        '''

        # 创建一个logger
        self.logger = logging.getLogger(logger)
        self.logger.setLevel(logging.DEBUG)

        # 创建一个handler,用于写入日志文件
        fh = logging.FileHandler(logname)
        fh.setLevel(logging.DEBUG)

        # 再创建一个handler,用于输出到控制台
        ch = logging.StreamHandler()
        ch.setLevel(logging.DEBUG)

        # 定义handler的输出格式
        #formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
        formatter = format_dict[int(loglevel)]
        fh.setFormatter(formatter)
        ch.setFormatter(formatter)

        # 给logger添加handler
        self.logger.addHandler(fh)
        self.logger.addHandler(ch)


    def getlog(self):
        return self.logger
  • 调用方式
logger = Logger(logname='log.txt', loglevel=1, logger="fox").getlog()

logging中的关键词

logging.basicConfig函数各参数:
filename: 指定日志文件名
filemode: 和file函数意义相同,指定日志文件的打开模式,’w’或’a’
format: 指定输出的格式和内容,format可以输出很多有用信息,如上例所示:
%(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: 打印日志信息
datefmt: 指定时间格式,同time.strftime()
level: 设置日志级别,默认为logging.WARNING
stream: 指定将日志的输出流,可以指定输出到sys.stderr,sys.stdout或者文件,默认输出到sys.stderr,当stream和filename同时指定时,stream被忽略