GVKun编程网logo

如何在Python的日志记录工具中添加自定义日志级别(如何在python的日志记录工具中添加自定义日志级别信息)

29

在本文中,我们将给您介绍关于如何在Python的日志记录工具中添加自定义日志级别的详细内容,并且为您解答如何在python的日志记录工具中添加自定义日志级别信息的相关问题,此外,我们还将为您提供关于J

在本文中,我们将给您介绍关于如何在Python的日志记录工具中添加自定义日志级别的详细内容,并且为您解答如何在python的日志记录工具中添加自定义日志级别信息的相关问题,此外,我们还将为您提供关于Java日志记录-如何将输出重定向到记录器的自定义日志文件?、Python3添加日志记录级别、python中的日志级别、Python日志记录-禁用导入模块的日志记录的知识。

本文目录一览:

如何在Python的日志记录工具中添加自定义日志级别(如何在python的日志记录工具中添加自定义日志级别信息)

如何在Python的日志记录工具中添加自定义日志级别(如何在python的日志记录工具中添加自定义日志级别信息)

我想为我的应用程序使用loglevel TRACE(5),因为我认为这debug()还不够。另外log(5,msg)不是我想要的。如何将自定义日志级别添加到Python记录器?

我有mylogger.py以下内容:

import logging@propertydef log(obj):    myLogger = logging.getLogger(obj.__class__.__name__)    return myLogger

在我的代码中,我通过以下方式使用它:

class ExampleClass(object):    from mylogger import log    def __init__(self):        ''''''The constructor with the logger''''''        self.log.debug("Init runs")

现在我想打电话 self.log.trace("foo bar")

在此先感谢您的帮助。

编辑
(2016年12月8日):我[pfa的)可接受答案更改为IMHO,这是基于Eric
S的非常好的建议的出色解决方案。

答案1

小编典典

@Eric S.

Eric
S.的回答很好,但是我通过实验得知,这将始终导致打印以新的调试级别记录的消息,而不管日志级别设置为什么。因此,如果您将的新级别号码设置为9,如果您致电setLevel(50),则会错误地打印
较低级别的 消息。

为了防止这种情况的发生,您需要在“ debugv”函数内的另一行检查是否实际启用了相关日志记录级别。

固定示例检查是否启用了日志记录级别:

import loggingDEBUG_LEVELV_NUM = 9 logging.addLevelName(DEBUG_LEVELV_NUM, "DEBUGV")def debugv(self, message, *args, **kws):    if self.isEnabledFor(DEBUG_LEVELV_NUM):        # Yes, logger takes its ''*args'' as ''args''.        self._log(DEBUG_LEVELV_NUM, message, args, **kws) logging.Logger.debugv = debugv

如果您查看Python 2.7的classLoggerin代码logging.__init__.py,这就是所有标准日志功能(.critical,.debug等)的功能。

我显然不能发表因缺乏声誉而对其他人的回答的回复…希望埃里克(Eric)会在看到这一点后更新他的帖子。=)

Java日志记录-如何将输出重定向到记录器的自定义日志文件?

Java日志记录-如何将输出重定向到记录器的自定义日志文件?

我对jdk日志记录配置有疑问。我有一个使用JDK Logging输出消息的EJB(已部署到glassfish中)。因此,我使用具有以下代码的命名记录器:

private static Logger logger = Logger.getLogger("org.imixs.workflow");
.....
       logger.fine(" some info...");
....

我知道可以通过将以下行添加到Glassfish的logging.properties文件中来为记录器配置日志级别:

.....
org.imixs.workflow.level=FINE

但是,如何为记录器指定输出文件?我想将来自名为“ org.imixs.workflow”的记录器的所有消息放入单独的文件中。这可能吗?

谢谢你的帮助

Python3添加日志记录级别

Python3添加日志记录级别

我有这段代码对我来说很好。

import loggingimport logging.handlerslogger = Nonedef create_logger():    global logger    logger = logging.getLogger(''Logger'')    logger.setLevel(logging.DEBUG)    handler = logging.handlers.RotatingFileHandler("C:/Users/user/Desktop/info.log", maxBytes=1000000, backupCount=20)    formatter = logging.Formatter(''%(asctime)s - %(name)s - %(levelname)s - %(message)s'')    handler.setFormatter(formatter)    logger.addHandler(handler)create_logger()logger.info("Text info")logger.debug("Text debug")logger.warning("Text warning")logger.error("Text error")logger.critical("Text critical")

输出看起来很棒:

2017-12-19 15:06:43,021-记录仪-信息-文本信息
2017-12-19 15:06:43,021-记录仪-调试-文本调试
2017-12-19 15:06:43,022-记录仪-警告-文本警告
2017-12-19 15:06:43,022-记录仪-错误-文本错误
2017-12-19 15:06:43,022-记录仪-严重-文本严重

好吧,我想添加一个新的日志记录级别,如下所示:

logger.message("Text message")

输出应该是这样的

2017-12-19 15:06:43,022-记录器-消息-短信

谢谢

答案1

小编典典

从日志记录文档(添加了重点):

定义自己的级别 是可能的,但不是必须的 ,因为现有级别是根据实践经验选择的。但是,如果您确信需要自定义级别,则在执行此操作时应 格外
小心, 如果要开发库,定义自定义级别可能是一个非常糟糕的主意
。这是因为,如果多个库作者都定义了自己的自定义级别,则使用这样的多个库的日志输出可能对使用开发人员难以控制和/或解释,因为给定的数值可能意味着不同的含义用于不同的库。

默认日志记录级别概述:

在此处输入图片说明

但是,如果您仍然愿意,可以设置自己的日志级别:

logging-module中,_levelToName并且_nameToLevel是日志记录名称和级别之间的映射。该addLevelName()函数无需手动添加到它们,而是为您执行此操作。

在这里,在日志级别 25中 添加了一个称为 MESSAGE 的新日志级别: __

import logging# Define MESSAGE log levelMESSAGE = 25# "Register" new loggin levellogging.addLevelName(MESSAGE, ''MESSAGE'')  # addLevelName(25, ''MESSAGE'')# Verifyassert logging.getLevelName(MESSAGE) == ''MESSAGE''

如果您不想创建自己的记录器类,但仍然希望记录其他日志级别,则可以Logger.log(level, msg)在传统记录器上使用-method:

logging.log(MESSAGE, ''This is a message'')

编辑:直接添加消息

 def message(self, msg, *args, **kwargs):    if self.isEnabledFor(MESSAGE):        self._log(MESSAGE, msg, args, **kwargs)

使message()-function在logging以下位置可用:

 logging.message = message # or setattr(logging, ''message'', message)

使message()-function在记录器中可用:

 logging.Logger.message = message # or setattr(logging.Logger, ''message'', message)

制作自定义Logger类

你可以让自己的Logger类作message(msg)-方法,被用来相若方式的其他人(例如info(msg)warning(msg)等)

在以下示例中,使用message(msg)-method制作了一个新的记录器来记录 MESSAGE

class MyLogger(logging.Logger):    def message(self, msg, *args, **kwargs):        if self.isEnabledFor(MESSAGE):            self._log(MESSAGE, msg, args, **kwargs)

获取记录器

我不确定什么是使其最佳使用的最佳方法logging.getLogger(name),但是下面是两种方法。参考 评论,我相信第一种方法更好:

要么 使新的记录器默认的日志记录类,这意味着新的记录情况将是的MyLogger类而不是默认的logging.Logger类:

logging.setLoggerClass(MyLogger)logger = logging.getLogger(''A new logger name'')logger.message(''This seems to work'')assert isInstance(logger, MyLogger)

或者 只是创建记录器的一个实例并将其添加到loggerDict活动logging.Manager实例中( EDIT
:不推荐,请参见注释):

my_logger = MyLogger(''Foo'')logging.Logger.manager.loggerDict[''Foo''] = my_loggerlogger = logging.getLogger(''Foo'')logger.message(''This is the same instance as my_logger'')assert logger is my_logger

使用新的日志级别

# Use the new logger classlogger.warning(''Custom log levels might be a bad idea'')logger.message(''Here is a message'')# Log with custom log level:logger.log(MESSAGE, ''This is a message'')

假定已将MESSAGE其预定义为代表对数级别的整数。(例如前面提到的 25

python中的日志级别

python中的日志级别

python中的日志级别

Python按照重要程度把日志分为5个级别,如下:

可以通过level参数,设置不同的日志级别。当设置为高的日志级别时,低于此级别的日志不再打印。

五种日志级别按从低到高排序:

DEBUG < INFO < WARNING < ERROR < CRITICAL

  1. level设置为DEBUG级别,所有的日志都会打印

import logging
logging.basicConfig(level=logging.DEBUG, format='' %(asctime)s - %(levelname)s -%(message)s'')
logging.debug(''Some debugging details.'')
logging.info(''The logging module is working'')
logging.warning(''An error message is about to be logged.'')
logging.error(''An error has occurred.'')
logging.critical(''The program is unable to recover!'')
 2019-11-17 15:24:30,065 - DEBUG -Some debugging details.
 2019-11-17 15:24:30,074 - INFO -The logging module is working
 2019-11-17 15:24:30,086 - WARNING -An error message is about to be logged.
 2019-11-17 15:24:30,105 - ERROR -An error has occurred.
 2019-11-17 15:24:30,107 - CRITICAL -The program is unable to recover!

  1. level设置为ERROR级别时,只显示ERROR和CRITICAL日志

import logging
logging.basicConfig(level=logging.ERROR, format='' %(asctime)s - %(levelname)s -%(message)s'')
logging.debug(''Some debugging details.'')
logging.info(''The logging module is working'')
logging.warning(''An error message is about to be logged.'')
logging.error(''An error has occurred.'')
logging.critical(''The program is unable to recover!'')
 2019-11-17 15:30:46,767 - ERROR -An error has occurred.
 2019-11-17 15:30:46,768 - CRITICAL -The program is unable to recover!

Python日志记录-禁用导入模块的日志记录

Python日志记录-禁用导入模块的日志记录

我正在使用Python日志记录模块,并且想禁用由导入的第三方模块打印的日志消息。例如,我正在使用类似以下内容的东西:

logger = logging.getLogger()logger.setLevel(level=logging.DEBUG)fh = logging.StreamHandler()fh_formatter = logging.Formatter(''%(asctime)s %(levelname)s %(lineno)d:%(filename)s(%(process)d) - %(message)s'')fh.setFormatter(fh_formatter)logger.addHandler(fh)

当执行logger.debug(“ my
message!”)时,此命令会打印出调试消息,但也会从我导入的任何模块(例如请求和许多其他内容)中打印出调试消息。

我只想查看我感兴趣的模块中的日志消息。是否可以使日志记录模块执行此操作?

理想情况下,我希望能够告诉记录器打印来自“ ModuleX,ModuleY”的消息,而忽略所有其他消息。

答案1

小编典典

问题在于,getLogger不带参数的调用将返回
记录器,因此,当您将级别logging.DEBUG设置为时,还将为使用该记录器的其他模块设置级别。

您可以通过 使用root记录器来解决此问题。为此,只需将名称作为参数传递,例如模块的名称:

logger = logging.getLogger(''my_module_name'')# as before

这将创建一个新的记录器,因此不会无意中更改其他模块的记录级别。


显然,您必须使用logger.debug而不是,logging.debug因为后者是一个方便的函数,它调用debug了root
logger的方法。

在“高级日志记录教程”中对此进行了提及。它还允许您以简单的方式知道哪个模块触发了日志消息。

关于如何在Python的日志记录工具中添加自定义日志级别如何在python的日志记录工具中添加自定义日志级别信息的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于Java日志记录-如何将输出重定向到记录器的自定义日志文件?、Python3添加日志记录级别、python中的日志级别、Python日志记录-禁用导入模块的日志记录的相关信息,请在本站寻找。

本文标签: