当前位置: 首页 > article >正文

38. 日志

一、日志的基本使用

logger.debug(msg, *args, **kwargs)        # 输出调试日志
logger.info(msg, *args, **kwargs)         # 输出消息日志
logger.warning(msg, *args, **kwargs)      # 输出警告日志
logger.error(msg, *args, **kwargs)        # 输出错误日志
logger.critical(msg, *args, **kwargs)     # 输出严重日志
logging.basicConfig(**kwargs)             # 配置日式输出信息

  在 Python 中系统内置的日志级别有六种:DEBUG、INFO、WARNING(默认值)、ERROR 以及 CRITICAL,系统会输出到控制台或者保存到日志文件的日志信息一定是等于或者高于当前等级的信息,例如当 level=logging.WARNING 时,只会输出或者保存 WARNING、ERROR 和 CRITICAL 级别的信息,其他级别的日志信息不会显示或保存,这也是 level 这个参数控制输出的意义所在。

日志级别数值
logging.CRITICAL50
logging.ERROR40
logging.WARNING30
logging.INFO20
logging.DEBUG10
logging.NOTSET0

  定义山中日志输出格式,日志中可能用到的格式串如下:

格式串描述
%(name)sLogger 的名字
%(levelno)s数字形式的日志级别
%(levelname)s文本形式的日志级别
%(pathname)s调试日志输出函数的模式的完整路径名,可能没有
%(filename)s调试日志输出函数的模块的文件名
%(module)s调试日志输出函数的模块名
%(funcName)s调试日志输出函数的函数名
%(lineno)s调式日志输出函数的语句所在的代码行
%(created)s当前时间,用 UNIX 标准的表示时间的浮点数表示
%(relativeCreated)d输出日志信息时的,自 Logger 创建以来的毫秒数
%(asctime)s字符串形式的当前时间,默认格式是 “年-月-日 时:分:秒,毫秒”
%(thread)d线程 ID,可能没有
%(threadName)s线程名,可能没有
%(process)d进程 ID,可能没有
%(message)s用户输出信息
import logging

logging.basicConfig(
    # 日志输出位置:1、中断 2、文件
    filename="access.log",          # 不指定,默认打印到中断

    # 日记格式:
    format="%(asctime)s - %(name)s - %(levelname)s - %(module)s: %(message)s",

    # 时间格式
    datefmt="%Y-%m-%d %H:%M:%S %p",

    # 日记级别:critical(50) error(40) warning(30) info(20) debut(10)
    level=10,
)

logging.debug("debug调试日志")
logging.info("info消息日志")
logging.warning("warning警告日志")
logging.error("error错误日志")
logging.critical("critical严重日志")

二、日志字典的使用

  Python 3.2 中引入的一种新的配置日志记录的方法–用字典来保存logging配置信息。这相对于上面所讲的基于配置文件来保存 logging 配置信息的方式来说,功能更加强大,也更加灵活,因为我们可把很多的数据转换成字典。

  传递给 dictConfig() 函数的字典对象只能包含下面这些 keys,其中 version 是必须指定的 key,其它 key 都是可选项:

key 名称描述
version必选项,其值是一个整数值,表示配置格式的版本,当前唯一可用的值就是 1。
formatters可选项,其值是一个字典对香港,该字典对象每个元素的 key 为要定义的格式器名称,value 为格式器的配置信息组成的 dict。
filters可选项,其值是一个字典对象,该字典对象每个元素的 key 为要定义的过滤器名称,value 为过滤器的配置信息组成的 dict。
handlers可选项,其值是一个字典对象,该字典对象每个元素的 key 为要定义的处理器名称,value 为处理器的配置信息组成的 dict。
loggers可选项,其值是一个字典对象,该字典对象每个元素的 key 为要定义的日志器名称,value 为日志器的配置信息组成的 dict。
root可选项,这是 root logger 的配置信息,其值也是一个字典对象。除非咋定义其它 logger 时明确指定 propagate 值为 no,否则 root logger 定义的 handlers 都会被作用到其它 logger 上。
incremental可选项,默认值为 False。该选项的意义在于,如果这里定义的对象已经存在,那么这里对这些对象的定义是应用到以存在的对象上。值为 False 表示,以存在的对象将会被重新定义。
disable_existing_loggers可选项,默认值为 True。该选项用于指定是否禁用以存在的日志器 loggers,如果 incremental 的值为 True 则该选项将会被忽略。
# 定义日志输出格式开始
standard_format = "[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]" \
                "[%(levelname)s][%(message)s]"
simple_format = "[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s"

# log配置字典
LOGGING_DIC = {
    "version": 1,
    "disable_existing_loggers": False,
    "formatters": {
        # 自定义的日志格式
        "standard": {
            "format": standard_format
        },
        "simple": {
            "format": simple_format
        },
    },
    "filters": {},                                              # 过滤日志
    # handlers是日记的接收者,不同的handler会将日志输出到不同的位置
    "handlers": {
        # 打印到终端的日志
        "console": {
            "level": "DEBUG",
            "class": "logging.StreamHandler",                   # 打印到屏幕
            "formatter": "simple"
        },
        # 打印到文件的日志,收集info及以上的日志
        "default": {
            "level": "DEBUG",
            "class": "logging.handlers.RotatingFileHandler",    # 保存到文件
            "formatter": "standard",
            "filename": "access.log",                           # 日志文件文件
            "maxBytes": 1024*1024*5,                            # 日志文件大小,达到大小后生成新的日志文件
            "backupCount": 5,                                   # 日志文件的个数
            "encoding": "utf-8",                                # 日志文件的编码
        },
    },
    # loggers是日志的产生着,产生的日志会传递给handler然后控制输出
    "loggers": {
        # logging.getLogger(__name__)拿到的logger配置
        "用户交易": {
            # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕
            "handlers": ["default", "console"],  
            "level": "DEBUG",
            "propagate": False,                                 # 默认为True,向上(更高level的logger)传递
        },  

        # logging.getLogger(__name__)拿到的logger配置
        "": {
            # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕
            "handlers": ["default", "console"],  
            "level": "DEBUG",
            "propagate": False,                                 # 默认为True,向上(更高level的logger)传递
        },  
    },
}
import logging
import logging.config

logging.config.dictConfig(LOGGING_DIC)                         # logging模块加载字典中的配置

logger = logging.getLogger("用户交易")                          # 获取指定的日志生产者
logger.debug("订单生成")

# loggers配置中使用空字符串作为字典的键 兼容性最好
logger = logging.getLogger("常规操作")                          # 获取指定的日志生产者
logger.debug("用户登录")

http://www.kler.cn/a/458039.html

相关文章:

  • 《Vue进阶教程》第三十一课:ref的初步实现
  • Linux命令——3.网络与用户
  • HTML5 标签输入框(Tag Input)详解
  • [算法] [leetcode-70] 爬楼梯
  • 14. 日常算法
  • JWT包中的源码分析【Golang】
  • MySQL root用户密码忘记怎么办(Reset root account password)
  • 爬虫案例-爬取网页图片
  • 基于STM32的智能垃圾桶的Proteus仿真
  • 使用 pushy 热更新后 sentry 不能正常显示源码
  • 玉米中的元基因调控网络突出了功能上相关的调控相互作用。/biosample_parser.py
  • 秒鲨后端之MyBatis【2】默认的类型别名、MyBatis的增删改查、idea中设置文件的配置模板、MyBatis获取参数值的两种方式、特殊SQL的执行
  • py打包工具
  • Python + 深度学习从 0 到 1(02 / 99)
  • 基于深度学习(HyperLPR3框架)的中文车牌识别系统-Qt调用Python
  • 在vue3中使用tsx结合render封装一个项目内通用的弹窗组件
  • Docker的概述与安装
  • 算法基础一:冒泡排序
  • React引入Echart水球图
  • systemverilog语法:assertion sequence
  • node-js Express防盗链
  • Spring Boot 多数据源解决方案:dynamic-datasource-spring-boot-starter 的奥秘(下)
  • 1.flask介绍、入门、基本用法
  • Python-网络爬虫
  • Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin(自测问题解决!)
  • 【每日学点鸿蒙知识】页面反向传值、图片撑满问题、清除Web缓存、Refresh支持swiper、POP颜色没效果