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)

大家都在看

  • MySQL学习笔记

    MySQL学习笔记 解决MYSQL中文乱码问题 一、乱码的原因: 1、 client客户端的编码不是utf8 2、server端的编码不是utf8 3、database数据库的编码…

    数据库 2023年6月14日
    094
  • 用Python做一个中秋抢购月饼的脚本

    ; 序言 每逢佳节倍思亲,想买个东西给家里,结果发现手速不够,网速不够快,没有时间下单等等各种原因导致最后想买的东西售罄了… 甚至跟你一起抢购的可能是脚本,太真实了! …

    数据库 2023年6月14日
    0104
  • 安装node、npm、vue cli脚手架

    1、node https://www.runoob.com/nodejs/nodejs-install-setup.html 2、npm 安装好node就默认安装好npm 不需要单…

    数据库 2023年6月9日
    083
  • index_merge引发的死锁排查

    前几天排查了一个死锁问题,最开始百思不得其解,因为发生死锁的两个事务是单语句事务,语句类型相同(where属性列相同,仅值不同),而且语句都走了相同的索引,但最终确实发生了死锁。通…

    数据库 2023年6月9日
    0113
  • Java线程通信

    Java线程通信 螣蛇乘雾,终为土灰。 多个线程协同工作完成某个任务时就会涉及到线程间通信问题。如何使各个线程之间同时执行,顺序执行、交叉执行等。 一、线程同时执行 创建两个线程a…

    数据库 2023年6月14日
    091
  • Mysql-5.7主从部署-yum方式

    一、环境准备 rpm -qa |grep mariadb |xargs yum remove -y setenforce 0(临时关闭),(selinux配置文件:SELINUX=…

    数据库 2023年5月24日
    066
  • Java学习-第一部分-第二阶段-第一节:面向对象编程(高级)

    面向对象编程(高级) 笔记目录:(https://www.cnblogs.com/wenjie2000/p/16378441.html) 类变量和类方法(static) 类变量 类…

    数据库 2023年6月11日
    0103
  • oracle 怎么查看用户对应的表空间

    oracle 怎么查看用户对应的表空间? 查询用户: 查看数据库里面所有用户,前提是你是有 dba 权限的帐号,如 sys,system: select * from dba_us…

    数据库 2023年6月14日
    078
  • Django中使用QQ登录

    1.返回QQ登录网址的视图 请求方式: GET /oauth/qq/authorization/?next=xxx 请求参数: 查询字符串 参数名 类型 是否必须 说明 next …

    数据库 2023年6月14日
    0112
  • [LeetCode]3. 无重复字符的最长子串

    给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。 示例 1: 输入: “abcabcbb”输出: 3解释: 因为无重复字符的最长子串是 &#…

    数据库 2023年6月9日
    070
  • mysql 内部函数

    1. group_concat 返回一个字符串结果,该结果由分组中的值连接组合而成。 函数语法: group_concat( [DISTINCT] 要连接的字段 [Order BY…

    数据库 2023年6月16日
    085
  • Airbnb JavaScript 代码规范(转载)

    一种写JavaScript更合理的代码风格。 其他代码风格指南 1.1 原始值: 当你访问一个原始类型的时候,你可以直接使用它的值。 string number boolean n…

    数据库 2023年6月11日
    0123
  • Git 环境搭建

    安装 Git:官网 👉https://git-scm.com/ GIt基础配置(以下操作均在 git bash 窗口下进行) git config –global user.na…

    数据库 2023年6月6日
    077
  • 获取不到http请求头自定义参数

    对外提供的API,需请求方在http请求头中传app_id(下划线分割) 然后服务端通过request.getHeader(“app_id”)获取不到对应的…

    数据库 2023年6月11日
    081
  • 11、lombok日志记录

    一、添加依赖: org.projectlombok lombok 1.16.18 true 二、改YML: #声明日志配置文件 #日志级别依次为【从高到低】:FATAL > …

    数据库 2023年6月6日
    099
  • 有趣的网络知识

    简单的网络入侵方法 命令 描述 attrib +s +a +h +r &#x78C1;&#x76D8;:&#x6587;&#x4EF6;&#…

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