欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

logging模块

程序员文章站 2023-01-14 22:12:50
一 日志级别: 二 默认级别为warning,默认打印到终端: 四 logging模块的Formatter,Handler,Logger,Filter对象: 七 应用: ......

一 日志级别:

critical = 50 #fatal = critical
error = 40
warning = 30 #warn = warning
info = 20
debug = 10
notset = 0 #不设置

二 默认级别为warning,默认打印到终端:

import logging

logging.debug('调试debug')
logging.info('消息info')
logging.warning('警告warn')
logging.error('错误error')
logging.critical('严重critical')

'''
warning:root:警告warn
error:root:错误error
critical:root:严重critical
'''

 

format参数中可能用到的格式化串:
%(name)s logger的名字
%(levelno)s 数字形式的日志级别
%(levelname)s 文本形式的日志级别
%(pathname)s 调用日志输出函数的模块的完整路径名,可能没有
%(filename)s 调用日志输出函数的模块的文件名
%(module)s 调用日志输出函数的模块名
%(funcname)s 调用日志输出函数的函数名
%(lineno)d 调用日志输出函数的语句所在的代码行
%(created)f 当前时间,用unix标准的表示时间的浮 点数表示
%(relativecreated)d 输出日志信息时的,自logger创建以 来的毫秒数
%(asctime)s 字符串形式的当前时间。默认格式是 “2003-07-08 16:49:45,896”。逗号后面的是毫秒
%(thread)d 线程id。可能没有
%(threadname)s 线程名。可能没有
%(process)d 进程id。可能没有
%(message)s用户输出的消息

 

#========使用
import logging
logging.basicconfig(filename='access.log',
                    format='%(asctime)s - %(name)s - %(levelname)s -%(module)s:  %(message)s',
                    datefmt='%y-%m-%d %h:%m:%s %p',
                    level=10)

logging.debug('调试debug')
logging.info('消息info')
logging.warning('警告warn')
logging.error('错误error')
logging.critical('严重critical')





#========结果
access.log内容:
2017-07-28 20:32:17 pm - root - debug -test:  调试debug
2017-07-28 20:32:17 pm - root - info -test:  消息info
2017-07-28 20:32:17 pm - root - warning -test:  警告warn
2017-07-28 20:32:17 pm - root - error -test:  错误error
2017-07-28 20:32:17 pm - root - critical -test:  严重critical

 

四 logging模块的formatter,handler,logger,filter对象:

#logger:产生日志的对象

#filter:过滤日志的对象

#handler:接收日志然后控制打印到不同的地方,filehandler用来打印到文件中,streamhandler用来打印到终端

#formatter对象:可以定制不同的日志格式对象,然后绑定给不同的handler对象使用,以此来控制不同的handler的日志格式


'''
critical=50
error =40
warning =30
info = 20
debug =10
'''


import logging

#1、logger对象:负责产生日志,然后交给filter过滤,然后交给不同的handler输出
logger=logging.getlogger(__file__)

#2、filter对象:不常用,略

#3、handler对象:接收logger传来的日志,然后控制输出
h1=logging.filehandler('t1.log') #打印到文件
h2=logging.filehandler('t2.log') #打印到文件
h3=logging.streamhandler() #打印到终端

#4、formatter对象:日志格式
formmater1=logging.formatter('%(asctime)s - %(name)s - %(levelname)s -%(module)s:  %(message)s',
                    datefmt='%y-%m-%d %h:%m:%s %p',)

formmater2=logging.formatter('%(asctime)s :  %(message)s',
                    datefmt='%y-%m-%d %h:%m:%s %p',)

formmater3=logging.formatter('%(name)s %(message)s',)


#5、为handler对象绑定格式
h1.setformatter(formmater1)
h2.setformatter(formmater2)
h3.setformatter(formmater3)

#6、将handler添加给logger并设置日志级别
logger.addhandler(h1)
logger.addhandler(h2)
logger.addhandler(h3)
logger.setlevel(10)

#7、测试
logger.debug('debug')
logger.info('info')
logger.warning('warning')
logger.error('error')
logger.critical('critical')

七 应用:

 

'''# 定义三种日志输出格式 开始'''

standard_format = '[%(asctime)s][%(threadname)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]' \
                  '[%(levelname)s][%(message)s]' #其中name为getlogger指定的名字

simple_format = '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s'

id_simple_format = '[%(levelname)s][%(asctime)s] %(message)s'

'''# 定义日志输出格式 结束'''

'''定义日志文件的路径'''
log_path=r'a3.log'



'''# log配置字典'''
logging_dic = {
    'version': 1,
    'disable_existing_loggers': false,
    'formatters': {
        'standard': {
            'format': standard_format
        },
        'simple': {
            'format': simple_format
        },
    },
    'filters': {},
    'handlers': {
        #打印到终端的日志
        'console': {
            'level': 'debug',
            'class': 'logging.streamhandler',  # 打印到屏幕
            'formatter': 'simple'
        },
        #打印到文件的日志,收集info及以上的日志
        'default': {
            'level': 'debug',
            'class': 'logging.handlers.rotatingfilehandler',  # 保存到文件
            'formatter': 'standard',
            'filename': log_path,  # 日志文件
            'maxbytes': 1024*1024*5,  # 日志大小 5m
            'backupcount': 5,
            'encoding': 'utf-8',  # 日志文件的编码,再也不用担心中文log乱码了
        },
    },
    'loggers': {
        #logging.getlogger(__name__)拿到的logger配置
        '': {
            'handlers': ['default', 'console'],  # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕
            'level': 'debug',
            'propagate': true,  # 向上(更高level的logger)传递
        },
    },
}



logging.config.dictconfig(logging_dic)  # 导入上面定义的logging配置
logger = logging.getlogger(__name__)  # 生成一个log实例
logger.debug('测试')  # 记录该文件的运行状态