首页 > 其他分享 >38. 日志

38. 日志

时间:2024-11-27 19:11:17浏览次数:6  
标签:输出 38 logging level 日志 logger 字典

一、日志的基本使用

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.CRITICAL 50
logging.ERROR 40
logging.WARNING 30
logging.INFO 20
logging.DEBUG 10
logging.NOTSET 0

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

格式串 描述
%(name)s Logger 的名字
%(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("用户登录")

标签:输出,38,logging,level,日志,logger,字典
From: https://www.cnblogs.com/FlurryHeart/p/18572915

相关文章

  • win10 系统日志
    使用Windows事件查看器打开事件查看器:按下 Win+R 键,输入 eventvwr.msc,然后按Enter键。浏览网络日志:在左侧面板中,导航到 Windows日志 > 系统。你可以通过右侧的 筛选当前日志 来限定日志的范围。选择一个日期范围来查看特定日期的活动。查找特定的网......
  • 洛谷题单指南-线段树-P3870 [TJOI2009] 开关
    原题链接:https://www.luogu.com.cn/problem/P3870题意解读:有n个数的序列,初始都是0,支持两种操作:将区间[l,r]内所有数异或1,求区间[l,r]内1个个数,输出所有求区间1的个数操作的结果。解题思路:灯的开关可以用0,1表示,改变灯的状态可以用异或操作,统计多少灯是开的就是计算1的个数,因此......
  • 【嵌入式开发】log.c:一个非常轻量的嵌入式日志库
    log.c简介github链接:https://github.com/rxi/log.clog.c是一个轻量级的日志库。一个用C99实现的简单日志库,这意味着它应该可以在任何支持C99标准的平台上编译和运行,如我们的嵌入式系统中。特点:使用C99标准,适用于嵌入式。支持静默模式。支持日志级别设置。支持ANSI颜......
  • 投递CDN实时日志到SLS来分析用户访问数据
    本文介绍如何使用实时日志功能对用户访问日志进行分析。概述阿里云CDN产品的实时日志功能是CDN产品与SLS产品联合推出的一项功能,是一种时效性非常高(延迟在3分钟左右)的日志数据处理服务,能够将CDN节点上采集到的用户访问日志实时推送至SLS日志服务,然后可以通过SLS来存储和分析......
  • Spring Boot 3.4 正式发布,结构化日志!
    1从SpringBoot3.3升级到3.41.1RestClient和RestTemplate新增对RestClient和RestTemplate自动配置的支持,可用ReactorNetty的HttpClient或JDK的HttpClient。支持的客户端优先级:ApacheHTTPComponents(HttpComponentsClientHttpRequestFactory)JettyCli......
  • AbMole| JNJ-42041935(CAS号1193383-09-3;目录号M8963)
    JNJ-42041935是一种高效的,竞争性的,选择性脯氨酰羟化酶PHD抑制剂,对于PHD1,PHD2andPHD3的pKi值分别为7.91±0.04,7.29±0.05和7.65±0.09。生物活性JNJ-42041935是一种有效的,2-氧戊二酸竞争性,可逆性和选择性PHD酶抑制剂。JNJ-42041935是PHD2181-417最有效的抑制剂,其pIC50......
  • cu:92: block: [387,0,0], thread: [61,0,0] Assertion `-sizes[i] <= index错误解决办
    一.引言    相信大家都对YOLO算法的改进有了或多或少的了解,当然我也不例外,本文默认大家已经会进行yolo改进,接下来给大家讲一个在训练过程中遇到的一个非常非常very“棘手”的错误,就是你的数据集可以训练,但是训练过程种验证的时候报错了,这个错误卡了我4个小时呜呜呜,并......
  • 占用磁盘100%?Apache DolphinScheduler 日志如何定时清理!
    当ApacheDolphinScheduler运行几个月后,大部分朋友会发现Logs下的运行日志越来越多,这时可以考虑清理下Logs/目录下的日志文件,比如设置只保留最近3天的日志,怎么操作呢?可以通过执行以下三个命令来实现:find./logs-typef-mtime+3-name"dolphinscheduler-worker.*.lo......
  • MySQL原理简介—7.redo日志的底层原理
    大纲1.redo日志对事务提交后数据不丢失的意义2.redo日志文件的构成3.redo日志会写入到RedoLogBlcok中4.redo日志如何写入到RedoLogBlcok中5.RedoLogBuffer解析6.RedoLogBuffer的刷盘时机7.undolog回滚日志原理 1.redo日志对事务提交后数据不丢失的意义(1)redo......
  • 《Django 5 By Example》阅读笔记:p237-p338
    《Django5ByExample》学习第11天,p237-p338总结,总计102页。一、技术总结1.followsystem(关注功能)表之间的关系有三种:OneToOneField,many-to-one(使用Foreignkey()),ManyToManyField。有时候为了更好的描述对象之间的关系,需要多创建一张中间表:Creatinganintermediatemodel......