zoukankan      html  css  js  c++  java
  • logging日志模块,四种方式

    1.最简单的用法

    import logging

    logging.error("hah")

    logging.info("hah")

    logging.debug("hah")

    logging.warning("hah")

    logging.critical("hah")

    info,debug并不会显示,默认级别为30

    级别debug(10)

    级别info(20)

    级别warning(30)

    级别error(40)

    级别critical(50)

    2.自定义日志格式

    import logging

    日志基本设置

    只能设置显示的信息格式,并不能设置日志级别和输出(屏幕或文件)

    logging.basicConfig(format="%(levelno)s-%(asctime)s-%(message)s")

    logging.error("hah")

    logging.info("hah")

    logging.debug("hah")

    logging.warning("hah")

    logging.critical("hah")

    3.自定义日志

    设置级别,之前两种方法都是warning级别以上输出

    设置输出,之前两种方法都是输出到屏幕

    四个重要组件

    1.Logger 日志生成器 负责产生一条完整的日志

    2.Filter 过滤器 负责对日志进行过滤(不常用,可以通过格式或级别过滤输出)

    3.Handler 处理器 负责将日志输出到指定位置

    4.Formater 格式化 负责处理日志显示的格式

    import logging

    # 1.创建1个logger:

    lg = logging.getLogger("zb")

    # 2.创建handler(负责输出,输出到屏幕streamhandler,输出到文件filehandler)

    fh = logging.FileHandler(filename="a.log",mode="a",encoding="utf-8")#默认mode 为a模式,默认编码方式为utf-8

    sh = logging.StreamHandler()

    # 3.创建formatter:

    formatter=logging.Formatter(fmt="%(asctime)s-%(name)s-%(levelname)s-%(message)s")

    # 4.绑定关系:①logger绑定handler

    lg.addHandler(fh)

    lg.addHandler(sh)

    # ②为handler绑定formatter

    fh.setFormatter(formatter)

    sh.setFormatter(formatter)

    # 5.设置日志级别(日志级别两层关卡必须都通过,日志才能正常记录)

    lg.setLevel(10)

    fh.setLevel(10)

    sh.setLevel(10)

    # 6.调用日志

    lg.debug("haha")

    4.导入模块,不用重复造轮子,已经有写好的模块可以直接调用

    (以下内容老男孩egon老师博客复制来的)

    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'

    定义日志输出格式 结束

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

    logfile_name = 'all2.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
    },
    },
    'filters': {},
    'handlers': {
    #打印到终端的日志
    'console': {
    'level': 'DEBUG',
    'class': 'logging.StreamHandler', # 打印到屏幕
    'formatter': 'simple'
    },
    #打印到文件的日志,收集info及以上的日志
    'default': {
    'level': 'DEBUG',
    'class': 'logging.handlers.RotatingFileHandler', # 保存到文件
    'formatter': 'standard',
    'filename': logfile_path, # 日志文件
    'maxBytes': 102410245, # 日志大小 5M
    'backupCount': 5,
    'encoding': 'utf-8', # 日志文件的编码,再也不用担心中文log乱码了
    },
    },
    'loggers': {
    #logging.getLogger(name)拿到的logger配置
    '': {
    'handlers': ['default', 'console'], # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕
    'level': 'DEBUG',
    'propagate': True, # 向上(更高level的logger)传递
    },
    },
    }

    def load_my_logging_cfg(msg):
    logging.config.dictConfig(LOGGING_DIC) # 导入上面定义的logging配置
    logger = logging.getLogger(name) # 生成一个log实例
    logger.info(msg) # 记录该文件的运行状态

    if name == 'main':
    load_my_logging_cfg()

    以上我们可以放入一个mylog.py文件,当做一个模块导入使用

    1.可以发现模块在最后帮我们定义了一个函数

    我们导入模块from log(项目文件夹log) import mylog

    logger = mylog.load_my_logging_cfg 这个函数名太长,搞个变量指向下

    使用这个函数存在一个问题,就是我们输出的级别被固定死为info

    2.如果我们要记录不同级别的日志,还得手动导入字典

    import logging

    import logging.config

    from log import mylog

    logging.config.dicConfig(mylog.LOGGING_DIG)从mylog模块导入配置字典

    logger = logging.getLogger("zb")生成一个日志生成器

    logging.error("hah")

    logging.info("hah")

    logging.debug("hah")

    logging.warning("hah")

    logging.critical("hah")

  • 相关阅读:
    小程序(1)
    手机端放在线条中间的标题
    不定长度导航的两端对齐
    扇形导航菜单
    个性搜索框
    javascript数组原型方法
    jquery插件开发的demo
    监听表单中的内容变化
    mui中的关闭页面的几种方法
    css之伪类选择器:before :after(::before ::after)
  • 原文地址:https://www.cnblogs.com/robert-zhou/p/10090754.html
Copyright © 2011-2022 走看看