Python日志模块封装

Python日志模块封装

一、先上结论

Python logging模块进行二次封装

-*- coding:utf-8 -*-
作者:IT小学生蔡坨坨
博客:caituotuo.top
时间:2022/3/16 20:10
功能:日志模块封装

import os
import time
import logging
from logging import handlers

from utils.get_path_info import GetPathInfo

class GetLogger(object):
    """ 日志封装类 """

    @classmethod
    def get_logger(cls):
        # logger = logging.getLogger(__name__) # 不会打印 HTTP General 信息
        log = logging.getLogger()
        level_relations = {
            'NOTSET': logging.NOTSET,
            'DEBUG': logging.DEBUG,
            'INFO': logging.INFO,
            'WARNING': logging.WARNING,
            'ERROR': logging.ERROR,
            'CRITICAL': logging.CRITICAL
        }  # 日志级别关系映射

        # 创建日志存放的目录
        project_path = GetPathInfo().get_project_path()  # get_project_path()获取项目根目录
        logs_dir = project_path + "logs"
        if os.path.exists(logs_dir) and os.path.isdir(logs_dir):
            pass
        else:
            os.mkdir(logs_dir)
        # 日志文件以日期命名
        log_file_name = '%s.log' % time.strftime("%Y-%m-%d", time.localtime())
        log_file_path = os.path.join(logs_dir, log_file_name)

        rotating_file_handler = handlers.TimedRotatingFileHandler(filename=log_file_path,
                                                                  when='D',  # 按天分隔,一天一个文件
                                                                  interval=30,
                                                                  encoding='utf-8')

        # 日志输出格式
        fmt = "%(asctime)s %(levelname)s %(pathname)s %(lineno)d %(message)s"
        formatter = logging.Formatter(fmt)
        rotating_file_handler.setFormatter(formatter)

        # 加上判断,避免重复打印日志
        if not log.handlers:
            # 控制台输出
            console = logging.StreamHandler()
            console.setLevel(level_relations["NOTSET"])
            console.setFormatter(formatter)
            # 写入日志文件
            log.addHandler(rotating_file_handler)
            log.addHandler(console)
            log.setLevel(level_relations['DEBUG'])
        return log

if __name__ == '__main__':
    logger = GetLogger().get_logger()
    logger.debug('调试')
    logger.info('信息')
    logger.warning('警告')
    logger.error('报错')
    logger.critical('严重')

二、logging.Formatter自定义日志格式

1. For example

fmt = "%(name)s %(asctime)s %(created)f %(relativeCreated)d %(msecs)d %(levelname)s %(levelno)s %(pathname)s %(filename)s %(module)s %(funcName)s %(lineno)d %(process)d %(thread)d %(threadName)s %(message)s"
formatter = logging.Formatter(fmt)

结果:
root 2022-03-20 03:00:05,449 1647716405.449377 28 449 DEBUG 10 F:/Desktop/qys_priv_open/utils/get_logger.py get_logger.py get_logger  68 7420 3244 MainThread 调试

2. 常用的格式字符串

格式字符串 作用 例如 %(name)s Logger的名称 root %(asctime)s

打印日志的时间,字符串形式(datetime.datetime.now()的返回值) 2022-03-20 02:30:12,776

(逗号后面是毫秒) %(created)f 日志打印的时间,用Unix标准地表示时间的浮点数(time.time()的返回值) 1647715277.792532 %(relativeCreated)d 输出日志信息的耗时,从Looger创建开始计时,以毫秒为单位 35 %(msecs)d 打印日志的时间的毫秒部分 449 %(levelname)s

日志级别,文本形式 “DEBUG”、”INFO”、”WARNING”、”ERROR”、”CRITICAL” %(levelno)s 日志级别,数字形式 DEBUG=10、INFO=20、WARNING=30、ERROR=40、CRITICAL=50 %(pathname)s

调用日志输出函数的模块的完整路径名 F:/Desktop/qys_priv_open/utils/get_logger.py %(filename)s 调用日志输入函数的模块的文件名 get_logger.py %(module)s 调用日志输出函数的模块名 get_logger %(funcName)s 调用日志输出函数的函数名 <module></module> %(lineno)d

调用日志输出函数的语句所在的代码行 69 %(process)d 进程ID 7840 %(thread)d 线程ID 6004 %(threadName)s 线程名 MainThread %(message)s

输出的日志信息 这是一条测试日志

原文链接:https://caituotuo.top/11abedfb.html

微信公众号:IT小学生蔡坨坨

Original: https://www.cnblogs.com/caituotuo/p/16015512.html
Author: 测试蔡坨坨
Title: Python日志模块封装

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/599307/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • [spring]spring中java实现类代替注解开发

    9.使用javaconfig实现代替xml配置 The central artifacts in Spring’s new Java-configuration sup…

    数据库 2023年6月16日
    062
  • dubbo 使用Multicast注册中心找不到Provider (No provider available for the service)

    使用Multicast注册中心配置,缺省配置为通过Multicast注册中心广播互相发现。所以在同一台机器时需设置unicast=false:即:multicast://224.5…

    数据库 2023年6月16日
    081
  • 浅谈GTID及简单测试

    今天简单介绍一下GTID,并有部分相关实验。 GTID相信大家都不陌生,GTID的英文全称为Global Transaction Identifier,在MySQL主从架构中应用广…

    数据库 2023年6月16日
    056
  • pycharm2022.2.1版本设置中文语言

    进入”File👉Sttings”界面 进入”Plugins(插件)”下,输入Chinese,找到”Chinese (Si…

    数据库 2023年6月14日
    089
  • B树-查找

    B树系列文章 1. B树-介绍 2. B树-查找 3. B树-插入 4. B树-删除 查找 假设有一棵3阶B树,如下图所示。 下面说明在该B树中查找 52的过程 首先,从根结点出发…

    数据库 2023年6月14日
    0133
  • mysql8.x docker 远程访问配置

    环境情况 mysql 8.x 是通过 docker 方式部署的,启动的 docker-compose.yml 如下: version: "3.2" servic…

    数据库 2023年5月24日
    060
  • Linux(CentOS)安装MinIo,详细教程,附防火墙端口开放操作

    Linux安装MinIo(已配置开机重启) 1,准备安装目录和文件 系统:CentOs #进入安装目录 cd /home/minio #在线下载二进制文件 wget https:/…

    数据库 2023年6月11日
    065
  • SQL中的排座位问题

    表: Seat +————-+———————+|…

    数据库 2023年6月14日
    081
  • SQL函数-聚合函数

    聚合函数 聚合函数是对一组数据进行汇总输出的函数。 输入:一组数据集合输出:单个值 举例:返回一组数据的最大值、平均数、最小、方差等操作。 常见函数举例: 1,AVG函数:返回一组…

    数据库 2023年5月24日
    0111
  • PHP设计模式—享元模式

    定义: 享元模式(Flyweight):运用共享技术有效地支持大量细粒度的对象。 结构: Flyweight:享元抽象类,所有具体享元类的接口,通过这个接口,Flyweight 可…

    数据库 2023年6月14日
    072
  • jieba分词java版本自定义stop_words

    背景 项目使用到jieba分词,分词部分结果产品不满意,想过滤一些不重要的高频词汇;我们是使用的结巴分词java版。maven引入如下: com.huaban jieba-anal…

    数据库 2023年6月11日
    082
  • pm2 常用命令

    写一篇文章帮助自己记忆整理一下pm2的常用命令 先说一些废话 之前学习 Nodejs项目的时候使用了 pm2作为生产环境的进程管理工具,最近服务器崩了需要重启一些服务,发现有些命令…

    数据库 2023年6月11日
    0105
  • ElasticSearch的简单api介绍

    1:ElasticSearch是什么? Elasticsearch 是一个分布式的免费开源搜索和分析引擎 适用于包括文本、数字、地理空间、结构化和非结构化数据等在内的所有类型的数据…

    数据库 2023年6月6日
    065
  • 基于 ShardingSphere 的得物数据库中间件平台“彩虹桥”演进之路

    本文系转载于公众号得物技术 前言 随着得物 App 用户开始快速增长,业务线日趋丰富,也对底层数据库带来了较大的压力。各个业务线对于数据分片、读写分离、影子库路由等等的需求成为了刚…

    数据库 2023年6月16日
    098
  • MySQL中读页缓冲区buffer pool

    Buffer pool 我们都知道我们读取页面是需要将其从磁盘中读到内存中,然后等待CPU对数据进行处理。我们直到从磁盘中读取数据到内存的过程是十分慢的,所以我们读取的页面需要将其…

    数据库 2023年5月24日
    0103
  • 阿里慢SQL治理5大经典案例

    菜鸟供应链金融慢sql治理已经有一段时间,自己负责的应用持续很长时间没有慢sql告警,现阶段在推进组内其他成员治理应用慢sql。这里把治理过程中的一些实践拿出来分享下。 一、全表扫…

    数据库 2023年5月24日
    0117
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球