首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在python3.5中扩展logging.Logger模块

在python3.5中扩展logging.Logger模块
EN

Stack Overflow用户
提问于 2018-05-17 10:40:45
回答 1查看 2.9K关注 0票数 5

我一直试图通过子类Logger来创建一个新的logging.Logger类。Python版本为3.5

我在我的应用程序中有几个模块,我只在主模块中配置日志记录,在这个模块中,我使用logging.setLoggerClass(...)设置记录器类。

但是,当我从其他模块检索相同的Logger实例时,它仍然创建Logger类的新实例,而不是我定义的子类实例。

例如,我的代码是:

代码语言:javascript
运行
AI代码解释
复制
# module 1
import logging
class MyLoggerClass(logging.getLoggerClass()):
     def __init__(name):
         super(MyLoggerClass, self).__init__(name)

     def new_logger_method(...):
         # some new functionality

if __name__ == "__main__":
    logging.setLoggerClass(MyLoggerClass)
    mylogger = logging.getLogger("mylogger")
    # configuration of mylogger instance

# module 2
import logging
applogger = logging.getLogger("mylogger")
print(type(applogger))
def some_function():
     applogger.debug("in module 2 some_function")

在执行此代码时,我希望模块2中的apploggerMyLoggerClass类型的。我打算将new_logger_method用于一些新功能。

但是,由于applogger的类型是logging.Logger,所以当代码运行时,抛出Logger没有名为new_logger_method的属性。

有没有人面临过这个问题?

提前感谢您的帮助!普拉纳夫

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-17 14:28:50

如果您希望模块能够很好地处理任何环境,而不是试图通过更改默认的记录器工厂来影响全局logger,您应该只为模块(及其子模块)定义一个记录器,并将其用作模块结构中其他更深层次的所有内容的主记录器。问题在于,您显式地希望使用与默认/全局定义的类不同的logging.Logger类,而logging模块并不提供一种轻松的方法来进行基于上下文的工厂切换,因此您必须自己完成。

有很多方法可以做到这一点,但我个人的偏好是尽可能明确地定义自己的logger模块,然后在您需要获得自定义记录器时将其导入包中的其他模块中。在您的示例中,您可以在包的根部创建logger.py,并执行如下操作:

代码语言:javascript
运行
AI代码解释
复制
import logging

class CustomLogger(logging.Logger):

    def __init__(self, name):
        super(CustomLogger, self).__init__(name)

    def new_logger_method(self, caller=None):
        self.info("new_logger_method() called from: {}.".format(caller))

def getLogger(name=None, custom_logger=True):
    if not custom_logger:
        return logging.getLogger(name)
    logging_class = logging.getLoggerClass()  # store the current logger factory for later
    logging._acquireLock()  # use the global logging lock for thread safety
    try:
        logging.setLoggerClass(CustomLogger)  # temporarily change the logger factory
        logger = logging.getLogger(name)
        logging.setLoggerClass(logging_class)  # be nice, revert the logger factory change
        return logger
    finally:
        logging._releaseLock()

如果您愿意的话,可以随意地在其中包含其他自定义日志初始化逻辑。然后,从您的其他模块(和子包)中,您可以导入这个记录器,并使用它的getLogger()获得一个本地的、自定义的记录器。例如,在module1.py中您所需要的就是:

代码语言:javascript
运行
AI代码解释
复制
from . import logger  # or `from package import logger` for external/non-relative use

log = logger.getLogger(__name__)  # obtain a main logger for this module

def test():  # lets define a function we can later call for testing
    log.new_logger_method("Module 1")

这包括内部使用--只要在所有模块/子模块中坚持这种模式,您就可以访问自定义记录器。

当涉及到外部使用时,您可以编写一个简单的测试,以表明您的自定义记录器被创建了,它不会干扰日志系统的其他部分,因此您的包/模块可以被宣布为一个好公民。假设您的module1.py位于一个名为package的包中,并且希望从外部对其进行整体测试:

代码语言:javascript
运行
AI代码解释
复制
import logging  # NOTE: we're importing the global, standard `logging` module
import package.module1

logging.basicConfig()  # initialize the most rudimentary root logger
root_logger = logging.getLogger()  # obtain the root logger
root_logger.setLevel(logging.DEBUG)  # set root log level to DEBUG

# lets see the difference in Logger types:
print(root_logger.__class__)  # <class 'logging.RootLogger'>
print(package.module1.log.__class__)  # <class 'package.logger.CustomLogger'>

# you can also obtain the logger by name to make sure it's in the hierarchy
# NOTE: we'll be getting it from the standard logging module so outsiders need
#       not to know that we manage our logging internally
print(logging.getLogger("package.module1").__class__) # <class 'package.logger.CustomLogger'>

# and we can test that it indeed has the custom method:
logging.getLogger("package.module1").new_logger_method("root!")
# INFO:package.module1:new_logger_method() called from: root!.
package.module1.test()  # lets call the test method within the module
# INFO:package.module1:new_logger_method() called from: Module 1.

# however, this will not affect anything outside of your package/module, e.g.:
test_logger = logging.getLogger("test_logger")
print(test_logger.__class__)  # <class 'logging.Logger'>
test_logger.info("I am a test logger!")
# INFO:test_logger:I am a test logger!
test_logger.new_logger_method("root - test")
# AttributeError: 'Logger' object has no attribute 'new_logger_method'
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50398444

复制
相关文章
OpenCV-Python学习(8)—— OpenCV 颜色表操作
1. 知识点 学习查找表 cv.LUT()【look up table】; 颜色查找表; 函数 cv.applyColorMap() 的使用。 2. cv.LUT() 函数说明 2.1 函数使用 cv.LUT(src, lut, dst) 2.2 参数说明 参数 说明 src 表示原始图像。 lut 表示查找表的地址,对于多通道图像的查找,它可以有一个通道,也可以与原始图像有相同的通道。 dst 表示输出图像。 2.3 查找表的使用和优点 构建查找表; 查找表应用; 查找表优势,预计算,空间换时间,避
Rattenking
2022/10/24
2.2K0
OpenCV-Python学习(8)—— OpenCV 颜色表操作
CSS颜色操作案例Demo【彩色标记笔】
案例代码: Html代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Colored Markers</title> <link rel="stylesheet" href="styles.css"> </head> <body>
百思不得小赵
2023/01/13
3650
CSS颜色操作案例Demo【彩色标记笔】
如何在 Tableau 中对列进行高亮颜色操作?
在做数据分析时,如果数据量比较大,可以考虑使用颜色对重点关注的数据进行高亮操作,显眼的颜色可以帮助我们快速了解数据和发现问题。比如一个数据表可能会有十几到几十列之多,为了更好的看清某些重要的列,我们可以对表进行如下操作——
小马哥的牛棚
2020/08/20
5.9K0
Python操作excel:用xlwt设置excel单元格背景颜色,给字体加粗。【附】颜色表
xlwt.easyxf() 设置样式,pattern 指的就是背景,ice_blue 就是我设置的颜色。 font 就是设置字体,bold on 是加粗。 样式可以合一起,之间用分号;分开。
小蓝枣
2020/09/23
3.6K0
YIQ颜色空间_简述RGB颜色
1、彩色的三要素 亮度:即人眼对光的明亮程度的感受。 色调:人眼能看到的颜色种类,与光的波长有关 饱和度:颜色深浅程度。与各种颜色混入白光的比例有关。 以上 色调 + 饱和度 = 色度
全栈程序员站长
2022/11/17
2.7K0
YIQ颜色空间_简述RGB颜色
Python操作高版本Excel文件:颜色、边框、合并单元格
本文主要颜色Python扩展库openpyxl的一些基本用法,包括创建工作簿、选择活动工作表、写入单元格数据,设置单元格字体颜色、边框样式,合并单元格等等。 from random import randint, choice from openpyxl import Workbook from openpyxl.styles import Font, colors, Border, Side from openpyxl.drawing.image import Image #创建工作簿 wb = Work
Python小屋屋主
2018/04/16
4.3K0
Python操作高版本Excel文件:颜色、边框、合并单元格
04.HTML区块/布局/表单/框架/颜色/颜色名/颜色值
04.HTML区块/布局/表单/ 框架/颜色/颜色名/颜色值 HTML <div> 和<span> ---- HTML 可以通过 <div> 和 <span>将元素组合起来。 ---- HTML 区块元素 大多数 HTML 元素被定义为块级元素或内联元素。 块级元素在浏览器显示时,通常会以新行来开始(和结束)。 实例: <h1>, <p>, <ul>, <table> ---- HTML 内联元素 内联元素在显示时通常不会以新行开始。 实例: <b>, <td>, <a>, <img> ---- HTML
Java帮帮
2018/03/15
6.7K0
04.HTML区块/布局/表单/框架/颜色/颜色名/颜色值
颜色空间
算法:RGB颜色空间基于三维直角坐标系,而HSI颜色空间圆柱体的横截面称为色环,色环清晰地展示了色调H和饱和度S两个参数,亮度I是由颜色点到圆柱体底部的距离表示。
裴来凡
2022/05/28
1.1K0
颜色空间
颜色直方图
算法:颜色直方图是在许多图像检索系统中被广泛采用的颜色特征。它所描述的是不同色彩在整幅图像中所占的比例,而并不关心每种色彩所处的空间位置,即无法描述图像中的对象或物体。颜色直方图特别适于描述那些难以进行自动分割的图像。
裴来凡
2022/05/28
1.5K0
颜色直方图
颜色转换,利用HSV颜色空间检测
绘制出这些通道的灰度版本 以便观察各通道的强度,像素越亮 代表的红色、绿色或蓝色值就越高。我们可以看到 粉色气球的红色值很高 蓝色值也相对比较高,但值大小不一 特别是当气球位于阴影下的时候。
小飞侠xp
2018/08/28
1.3K0
颜色、网页颜色与网页安全色
我们所看到的屏幕上所有的颜色都是由红、绿、蓝这三种基色调混合而成的。(在印刷上,颜色是四种颜色合成的,这个是表示方式上的不同。)每一种颜色的饱和度和透明度都是可以变化的,用0~255的数值来表示。如纯红色表示为(255,0,0),十六进制表示为#FF0000。按这种表达方式,理论上我们可以得到256*256*256=16777216种颜色。
大江小浪
2018/07/25
3.6K0
颜色、网页颜色与网页安全色
颜色原理
色相是用来区别区别颜色的标志,是光由于波长、频率的不同而产生的性质。色相是在光谱上自然分割的结果。
hotarugali
2022/03/01
2.2K0
颜色原理
颜色空间
RGB 立方体(描述各个分量的变化导致的颜色变化趋势) YUV 平面(压缩数据) HSV 锥体(人体视觉,cv2::inrange函数颜色分割)
sofu456
2019/08/26
2K0
颜色空间
SAP abap ALV的列颜色、、行颜色、单元格颜色设置
matinal
2023/10/13
4730
颜色滤镜
我们手机上有很多照片处理软件,图片滤镜是里面不可或缺的一部分,我们可以先尝试一些很简单的滤镜的算法,管中窥豹地去认识一下色彩的处理
异名
2020/06/09
2.2K0
颜色传输
由于目前图像采用的颜色空间主要为 RGB 空间,但 RGB 颜色空间的各分量之间存在着相关性,这就意味着如果改变一个像素颜色外观的话,必须改变所有的颜色通道,这使得颜色更改过程变得极为复杂。而后 Ruderman 等人基于人类视觉对图像数据的感知研究,提出了lαβ 颜色空间,与 RGB 及其他颜色空间不同的是在 lαβ 颜色空间中通道间数据的相关性最小,从而可在不同的通道独立地进行统计信息的传递。
客怎眠qvq
2022/11/01
8610
颜色传输
点击加载更多

相似问题

Eclipse Juno中的Android SDK Content Loader错误

21

Eclipse挂在Android SDK内容加载器上

17171

Android SDK Content Loader因NullPointerException而失败

223

Eclipse : Android SDK

11

android eclipse sdk位置

11
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文