- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在使用两个日志处理程序。一个是 DEBUG 及以上级别的文件,另一个是 WARNING 及以上级别的控制台。我正在使用许多模块,其中一些是外部模块(使用 pip 安装)。当调用 logging.info()
(与 logger.info()
相反)时,这会破坏控制台记录器的设置:
import logging
import logging.handlers
import sys, os
from demo_module import something, something_else
logger = logging.getLogger("demo")
logger.setLevel(logging.DEBUG)
main_handler = logging.FileHandler('demo.log')
formatter = logging.Formatter('%(asctime)s %(name)s %(levelname)-8s %(filename)s:%(lineno)d %(message)s')
main_handler.setFormatter(formatter)
logger.addHandler(main_handler)
# log serious issues to console
console_handler = logging.StreamHandler(stream=sys.stderr)
console_handler.setLevel(logging.WARNING)
console_handler.setFormatter(formatter)
logger.addHandler(console_handler)
logger.debug('this is a debug')
logger.info('this is an info')
logger.warning('this is a warning')
logger.error('this is an error')
logger.critical('reactor has melted down')
something()
logger.info('after something')
something_else()
logger.info('after something else')
demo_module.py 所在位置:
import logging
logger = logging.getLogger('demo')
def something():
logger.info('something needs to be done')
a = 1+1
logger.info('something has been done')
logger.error('some banale error')
def something_else():
logger.info('calling logger.info')
# OOPS, calling logging instead of logger here
logging.info("module may use logging directly instead of logger")
logger.info('logger.info called')
如您所见,在 demo_module.something_else()
内部调用了 logging.info
而不是 logger.info
。
控制台的输出如下所示:
% python logger.py
2017-10-07 17:45:08,077 demo WARNING logger2.py:21 this is a warning
2017-10-07 17:45:08,077 demo ERROR logger2.py:22 this is an error
2017-10-07 17:45:08,077 demo CRITICAL logger2.py:23 reactor has melted down
2017-10-07 17:45:08,078 demo ERROR demo_module.py:8 some banale error
INFO:demo:logger.info called
INFO:demo:after something else
如您所见,最后两行丢失了我最初为控制台处理程序设置的所有设置,例如级别和格式化程序。如果这只是我的代码,我可以找到这个有问题的 logging.info()
语句并替换它,但有些代码不是我的,而是第三方的,因此超出了我的控制范围。知道如何让这些设置保持不变吗?
最佳答案
默认情况下,模块级日志记录函数将调用 logging.basicConfig()
尝试配置根记录器。 Docs :
... module-level convenience functions, which delegate to the root logger, call basicConfig() to ensure that at least one handler is available.
logging.basicConfig
的docs状态:
This function does nothing if the root logger already has handlers configured for it.
因此,解决方案是在调用任何模块级日志函数之前在根记录器上配置处理程序,同时指示记录器不要在记录器层次结构中传播消息,以避免重复输出。
import logging
import logging.handlers
import sys, os
from demo import something, something_else
formatter = logging.Formatter('%(asctime)s %(name)s %(levelname)-8s %(filename)s:%(lineno)d %(message)s')
# Configure the root logger.
root_logger = logging.getLogger()
root_logger.setLevel(logging.DEBUG)
# Configure file handler.
root_main_handler = logging.FileHandler('demo.log')
root_main_handler.setFormatter(formatter)
root_logger.addHandler(root_main_handler)
# Configure console handler.
root_console_handler = logging.StreamHandler(stream=sys.stderr)
root_console_handler.setLevel(logging.WARNING)
root_console_handler.setFormatter(formatter)
root_logger.addHandler(root_console_handler)
logger = logging.getLogger("demo")
logger.setLevel(logging.DEBUG)
main_handler = logging.FileHandler('demo.log')
main_handler.setFormatter(formatter)
logger.addHandler(main_handler)
# log serious issues to console
console_handler = logging.StreamHandler(stream=sys.stderr)
console_handler.setLevel(logging.WARNING)
console_handler.setFormatter(formatter)
logger.addHandler(console_handler)
# Don't propagate messages up to the root logger.
logger.propagate = False
logger.debug('this is a debug')
logger.info('this is an info')
logger.warning('this is a warning')
logger.error('this is an error')
logger.critical('reactor has melted down')
something()
logger.info('after something')
something_else()
logger.info('after something else')
控制台输出:
2017-10-07 18:46:50,644 demo WARNING run.py:35 this is a warning
2017-10-07 18:46:50,644 demo ERROR run.py:36 this is an error
2017-10-07 18:46:50,644 demo CRITICAL run.py:37 reactor has melted down
2017-10-07 18:46:50,645 demo ERROR demo.py:8 some banale error
文件输出:
2017-10-07 18:46:50,644 demo DEBUG run.py:33 this is a debug
2017-10-07 18:46:50,644 demo INFO run.py:34 this is an info
2017-10-07 18:46:50,644 demo WARNING run.py:35 this is a warning
2017-10-07 18:46:50,644 demo ERROR run.py:36 this is an error
2017-10-07 18:46:50,644 demo CRITICAL run.py:37 reactor has melted down
2017-10-07 18:46:50,645 demo INFO demo.py:5 something needs to be done
2017-10-07 18:46:50,645 demo INFO demo.py:7 something has been done
2017-10-07 18:46:50,645 demo ERROR demo.py:8 some banale error
2017-10-07 18:46:50,645 demo INFO run.py:39 after something
2017-10-07 18:46:50,645 demo INFO demo.py:11 calling logger.info
2017-10-07 18:46:50,645 root INFO demo.py:13 module may use logging directly instead of logger
2017-10-07 18:46:50,645 demo INFO demo.py:14 logger.info called
2017-10-07 18:46:50,645 demo INFO run.py:41 after something else
关于python - 使用logging.info而不是logger.info会破坏StreamHandler,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46621663/
以下代码中的 alert(`${info} : ${pokemondetails[info]}\n`) 的含义是什么?有人可以用更简单的形式向我解释一下吗? let checkname = funct
C-x C-f blah.info 以基本模式打开文件。我使用了 apropos 并发现了 Info-mode,我认为它可能会从基本模式更改为 Info 模式,但这会引发 lisp 错误。 如何在 e
我想在另一个 Info.plist 键 (NSContactsUsageDescription) 的值中使用“Bundle 显示名称”(CFBundleDisplayName) 的值。 我尝试了以下方
我正在使用 Python 3.6.4。我第一次遇到 logger.setLevel(logging.INFO) 被忽略的问题,然后遇到了 this answer ,这让我感到困惑并引发了这个问题。 鉴
我是python新手 如果 logging.info() 足以进行日志记录,为什么我们必须使用 getLogger() 方法实例化一个记录器? 最佳答案 在没有名称的情况下调用 getLogger()
下面是来自源代码的示例代码:https://docs.python.org/3/howto/logging.html import logging logging.basicConfig(filena
我在网上阅读的所有内容都在谈论 Info.plist。当我创建项目时,XCode 为我创建了一个 [应用程序名称]-Info.plist 文件,它似乎与我在网上看到的示例 Info.plist 具有相
我定义了一个记录器实例如下: private static final Logger LOGGER = Logger.getLogger(Main.class.getName()); 我有一个要记录的
我的应用程序因 Info.plist 文件中缺少用途字符串而被拒绝(特别是对于 NSMicrophoneUsageDescription 用法)。 这取决于 react-native-permissi
我正在 Windows 下使用 Python 3.4.2。就我而言, import logging logger = logging.getLogger('logger') logger.setLev
我的背景主要是使用 C 和 C++ 进行 Windows 编程。最近我也有机会使用一些嵌入式 Linux 系统,但我对此还是个新手。 现在我正在为 Openwrt 开发一个实用程序,它需要对正常操作期
所以我只是按照此处所述运行了 INFO 命令 http://redis.io/commands/info 但它只给我默认部分——比如 cpu 信息和其他 当我尝试添加 [section] 参数时 -
我正在尝试了解 QEMU 内存管理(使用 i386 guest ,没有 KVM)。 QEMU 监视器允许列出 CPU 寄存器信息( info registers )、USB 设备( info usb
我的包中有 package-info.java,Hibernate 需要它来实现某些功能(编程实体扫描)。 但是,mvn package 不会导致 package-info.class 在 class
我遇到了似乎很常见的错误,因为 Xcode 似乎找不到我的“Info.plist”文件。 我已经检查了这两个 StackOverflow 问题的答案( Could not read from Info
我一直在尝试阅读 XEP-0030 Service Discovery但发现该语言非常不透明。 我的问题很简单:disco#info 规范和 disco#items 规范有什么区别? 我的猜测是 di
这个问题已经有答案了: String concatenation performance in Log4j (3 个回答) 已关闭 4 年前。 之前我通常使用log.info(“dsasdds ” +
我从 Erlang 文档中看到 supervisor:start_child 可以返回两个不同的非错误结果:{ok, Child} 和 {ok, Child, Info}。这个信息在哪里设置? sim
我使用的是 Crystal 0.25.0,File.info(string).symlink? 在以下示例中应返回 true 时返回 false: `mkdir -p /tmp/delete` Di
对于属性: Persist Security Info=true 和 Persist Security Info=false 你能告诉我它们之间有什么区别吗,如果我不把它放在我的连接中会发生什么? c
我是一名优秀的程序员,十分优秀!