完全禁用python日志记录

itu*_*tun 8 python logging

在我使用的代码中logging.info(...,在此之前我使用logging.basicConfig(filename=.... 是否可以在代码中保留日志行而不做任何事情?

Sim*_*ser 13

您可以使用:

logging.disable(logging.CRITICAL)
Run Code Online (Sandbox Code Playgroud)

禁用所有日志调用,其在临界水平或以下。这实际上会禁用所有日志记录调用。

您可以通过执行以下操作再次启用所有记录器的日志记录(在它们自己的日志记录级别):

logging.disable(logging.NOTSET)
Run Code Online (Sandbox Code Playgroud)


Mag*_*ero 11

日志记录具有以下结构

\n
    \n
  • 记录器根据带有点分隔符的命名空间层次结构进行排列;
  • \n
  • 每个记录器都有一个级别logging.WARNING默认为根记录器,logging.NOTSET默认为非根记录器)和一个有效级别(非根记录器的父记录器的有效级别,否则logging.NOTSET为记录器的级别);
  • \n
  • 每个记录器都有一个过滤器列表;
  • \n
  • 每个记录器都有一个处理程序列表;
  • \n
  • 每个处理程序都有一个级别logging.NOTSET默认情况下);
  • \n
  • 每个处理程序都有一个过滤器列表。
  • \n
\n

日志记录有以下过程(用流程图表示):

\n

记录流程。

\n

因此,要禁用特定记录器,您可以采用以下策略之一:

\n
    \n
  1. 将记录器的级别设置为logging.CRITICAL + 1

    \n\n
  2. \n
  3. lambda record: False向记录器添加过滤器。

    \n
      \n
    • 使用主要 API:

      \n
      import logging\n\nlogger = logging.getLogger("foo")\nlogger.addFilter(lambda record: False)\n
      Run Code Online (Sandbox Code Playgroud)\n
    • \n
    • 使用配置 API:

      \n
      import logging.config\n\nlogging.config.dictConfig({\n    "version": 1,\n    "filters": {\n        "all": {\n            "()": lambda: (lambda record: False)\n        }\n    },\n    "loggers": {\n        "foo": {\n            "filters": ["all"]\n        }\n    }\n})\n
      Run Code Online (Sandbox Code Playgroud)\n
    • \n
    \n
  4. \n
  5. 删除记录器的现有处理程序,向记录器添加一个处理程序logging.NullHandler()logging.lastResort(以防止事件由使用logging.StreamHandler当前流sys.stderr和级别的处理程序处理logging.WARNING)并将记录器的属性设置propagateFalse为(以防止事件被处理由记录器的祖先记录器的处理程序)。

    \n
      \n
    • 使用主要 API:

      \n
      import logging\n\nlogger = logging.getLogger("foo")\nfor handler in logger.handlers.copy():\n    try:\n        logger.removeHandler(handler)\n    except ValueError:  # in case another thread has already removed it\n        pass\nlogger.addHandler(logging.NullHandler())\nlogger.propagate = False\n
      Run Code Online (Sandbox Code Playgroud)\n
    • \n
    • 使用配置 API:

      \n
      import logging.config\n\nlogging.config.dictConfig({\n    "version": 1,\n    "handlers": {\n        "null": {\n            "class": "logging.NullHandler"\n        }\n    },\n    "loggers": {\n        "foo": {\n            "handlers": ["null"],\n            "propagate": False\n        }\n    }\n})\n
      Run Code Online (Sandbox Code Playgroud)\n
    • \n
    \n
  6. \n
\n

警告。\xe2\x80\x94 与仅阻止记录器及其祖先记录器的处理程序发出记录器记录的事件的策略 1 和 2 相反,策略 3 还阻止记录器的后代记录器logging.getLogger("foo.bar")记录的事件(例如)由记录器及其祖先记录器的处理程序发出。

\n

笔记。disabled\xe2\x80\x94 将记录器的属性设置为True并不是另一种策略,因为它不是公共 API 的一部分(参见https://github.com/python/cpython/issues/80499):

\n
import logging\n\nlogger = logging.getLogger("foo")\nlogger.disabled = True  # DO NOT DO THIS\n
Run Code Online (Sandbox Code Playgroud)\n


Wol*_*lph 7

编辑:似乎disabled不应该供公众使用。查看Maggyero 的答案以获取替代解决方案。

只需禁用日志处理程序,它就不会再写入任何内容。

logging.getLogger().disabled = True
Run Code Online (Sandbox Code Playgroud)

请注意,每个记录器都可以有处理程序,因此可能会有更多处理程序。