在本文中,我们将给您介绍关于如何在Python的日志记录工具中添加自定义日志级别的详细内容,并且为您解答如何在python的日志记录工具中添加自定义日志级别信息的相关问题,此外,我们还将为您提供关于J
在本文中,我们将给您介绍关于如何在Python的日志记录工具中添加自定义日志级别的详细内容,并且为您解答如何在python的日志记录工具中添加自定义日志级别信息的相关问题,此外,我们还将为您提供关于Java日志记录-如何将输出重定向到记录器的自定义日志文件?、Python3添加日志记录级别、python中的日志级别、Python日志记录-禁用导入模块的日志记录的知识。
本文目录一览:- 如何在Python的日志记录工具中添加自定义日志级别(如何在python的日志记录工具中添加自定义日志级别信息)
- Java日志记录-如何将输出重定向到记录器的自定义日志文件?
- Python3添加日志记录级别
- 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的classLogger
in代码logging.__init__.py
,这就是所有标准日志功能(.critical,.debug等)的功能。
我显然不能发表因缺乏声誉而对其他人的回答的回复…希望埃里克(Eric)会在看到这一点后更新他的帖子。=)
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添加日志记录级别
我有这段代码对我来说很好。
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按照重要程度把日志分为5个级别,如下:
可以通过level参数,设置不同的日志级别。当设置为高的日志级别时,低于此级别的日志不再打印。
五种日志级别按从低到高排序:
DEBUG < INFO < WARNING < ERROR < CRITICAL
-
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!
-
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日志记录模块,并且想禁用由导入的第三方模块打印的日志消息。例如,我正在使用类似以下内容的东西:
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日志记录-禁用导入模块的日志记录的相关信息,请在本站寻找。
本文标签: