logging日志模块

# 日志就是记录一些信息,方便查询或者辅助开发。
分为两种:
1、记录文件
2、显示屏幕。

# 低配
# 低配
import logging

# 五种级别,由低到高,默认从warning级别显示。
logging.basicConfig(
        # level=logging.DEBUG,
        level=10,  # 显示的级别
        format='%(asctime)s %(filename)s [line:%(lineno)d] %(levelname)s %(message)s',  # 显示格式
        datefmt='%Y %m %d',  # 日期
        # filename='a.log',  # 默认是a模式, 就是使用的gbk 编码。
        # filemode='w'  一般不用改。

)

logging.debug('调试模式')  # 10
logging.info('正常运行')  # 20
logging.warning('警告')  # 30
logging.error('错误')  # 40
logging.critical('系统崩了')  # 50
# 低配:只能写入文件或者屏幕输出。

 

标配:

# 标配

import logging
print(logging)
#
# 1、 创建logging对象
logger = logging.getLogger()

# 2、 创建文件对象
fh1 = logging.FileHandler('a1.log', encoding='utf-8')
fh2 = logging.FileHandler('a2.log', encoding='utf-8')
# ......

# 3、 创建屏幕对象
sh = logging.StreamHandler()

# 4、给2个文件对象和1个屏幕对象创建格式化
formater1 = logging.Formatter(
        fmt='%(asctime)s %(filename)s [line:%(lineno)d] %(levelname)s %(message)s',  # 显示格式
        datefmt='%Y-%m-%d %H:%M:%S',)

formater2 = logging.Formatter(
        fmt='%(asctime)s %(levelname)s %(message)s',  # 显示格式
        datefmt='%Y-%m-%d %H:%M:%S',)

formater3 = logging.Formatter(
        fmt='%(asctime)s %(filename)s [line:%(lineno)d] %(levelname)s %(message)s',  # 显示格式
        datefmt='%Y-%m-%d %H:%M:%S',)

# 5、给对象绑定格式(武功)
fh1.setFormatter(formater1)
fh2.setFormatter(formater2)
sh.setFormatter(formater3)

# 6、给logger对象添加其他对象(加入天龙八部这本书)
logger.addHandler(fh1)
logger.addHandler(fh2)
logger.addHandler(sh)


# 设置logger级别(手动指定级别)
logger.setLevel(10)
sh.setLevel(50)  # 按照logger对象设置的级别显示
fh1.setLevel(30)
fh2.setLevel(30)

logging.debug('调试模式')  # 10
logging.info('正常运行')  # 20
logging.warning('警告')  # 30
logging.error('错误')  # 40
logging.critical('系统崩了')  # 50

实例:
import logging
from logging import handlers

class Logger:
    level_relations = {
        'debug': logging.DEBUG,
        'info': logging.INFO,
        'warning': logging.WARNING,
        'error': logging.ERROR,
        'crit': logging.CRITICAL
    }#日志级别关系映射

    def __init__(self, filename, level='info', when='D', backCount=5,
                 fmt='%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s'):
        # print(self)
        self.logger = logging.getLogger()
        # print(self.logger)   #<RootLogger root (WARNING)>
        self.logger = logging.getLogger(filename)
        # print(self.logger)   #<Logger all.log (WARNING)>

        format_str = logging.Formatter(fmt)  # 设置日志格式

        self.logger.setLevel(self.level_relations.get(level))  # 设置日志级别
        # print(self.level_relations.get(level))


        # 往文件里写入#指定间隔时间自动生成文件的处理器
        th = handlers.TimedRotatingFileHandler(filename=filename, when=when, backupCount=backCount, encoding='utf-8')
        # print(th.when,th.backupCount)
        th.setFormatter(format_str)  # 设置文件里写入的格式

        sh = logging.StreamHandler()  # 往屏幕上输出
        sh.setFormatter(format_str)   # 设置屏幕上显示的格式


        self.logger.addHandler(sh)  # 把对象加到logger里
        self.logger.addHandler(th)


if __name__ == '__main__':
    log = Logger('all.log', level='info')
    # Logger('all.log', level='debug')
    # print(log)  #<__main__.Logger object at 0x00C4F670>

    log.logger.debug('调试模式')
    log.logger.info('正常运行')
    log.logger.warning('警告')
    log.logger.error('报错了')
    log.logger.critical('系统崩了')

    log2 = Logger('error.log', level='warning')
    log2.logger.error('支付出错了!!!')

  

 

 






# 高配。
# 通过导入文件(导入字典的方式)写日志 Django。

"""
logging配置
"""

import os
import logging.config

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

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'

# 定义日志输出格式 结束

# print(__file__)
logfile_dir = os.path.dirname(os.path.abspath(__file__))  # log文件的目录

logfile_name = '高配版.log'  # log文件名

# # 如果不存在定义的日志目录就创建一个
# if not os.path.isdir(logfile_dir):
#     os.mkdir(logfile_dir)

# log文件的全路径
logfile_path = os.path.join(logfile_dir, logfile_name)


# log配置字典
# 第一层键值对的键固定的关键字不能改变。
LOGGING_DIC = {
    'version': 1, # 版本
    'disable_existing_loggers': False,  #
    'formatters': {
        'standard': {
            'format': standard_format
        },
        'simple': {
            'format': simple_format
        },
        'id_simple_format':{
                'format': id_simple_format
        }
    },
    'filters': {},
    'handlers': {
        #打印到终端的日志
        'console': {
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',  # 打印到屏幕
            'formatter': 'simple'
        },
        #打印到文件的日志,收集info及以上的日志
        'default': {
            'level': 'DEBUG',
            'class': 'logging.handlers.RotatingFileHandler',  # 保存到文件
            'formatter': 'standard',
            'filename': logfile_path,  # 日志文件
            'maxBytes': 300,  # 日志大小 300bytes
            'backupCount': 5, # 最多只有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配置
# # logging.config  # 将你写好的logging 字典 在导入logging.config后,传到logging模块中
logger = logging.getLogger()  # 生成一个log实例  通过字典自己设置的个性化的log对象


logger.info('正常运行状态')  # 记录该文件的运行状态

 

 


 

posted @ 2018-12-02 20:19  小菜鸟111  阅读(196)  评论(0编辑  收藏  举报