使用Python记录器记录到文件和stderr
我正在尝试向使用标准Python(2.7)日志库的项目添加一个模块。我希望实现以下目标:使用Python记录器记录到文件和stderr,python,logging,python-2.7,Python,Logging,Python 2.7,我正在尝试向使用标准Python(2.7)日志库的项目添加一个模块。我希望实现以下目标: 无论主程序(在我的控制之外)将日志配置到哪里(通常是stderr),都会出现任何与警告相同或更糟的情况 其他所有内容(主要是调试消息)都会进入日志文件 请注意,这里的关键问题是我不想修改全局日志记录设置,因为这些设置由主应用程序控制。否则,我将使用这里的示例: 我试过这个: logger = logging.getLogger('my_module') logger.setLevel(logging.
- 无论主程序(在我的控制之外)将日志配置到哪里(通常是stderr),都会出现任何与警告相同或更糟的情况
- 其他所有内容(主要是调试消息)都会进入日志文件
logger = logging.getLogger('my_module')
logger.setLevel(logging.WARNING)
fh = logging.FileHandler('my_module.log')
fh.setLevel(logging.DEBUG)
logger.addHandler(fh)
logger = logging.getLogger('my_module')
logger.setLevel(logging.DEBUG)
logger.addHandler(logging.NullHandler())
console = logging.StreamHandler()
console.setLevel(logging.WARNING)
logger.addHandler(console)
fh = logging.FileHandler('my_module.log')
fh.setLevel(logging.DEBUG)
logger.addHandler(fh)
但我的文件中只会收到警告信息
如果我将上述行替换为:
logger.setLevel(logging.DEBUG)
然后我在stderr和我的文件中得到调试消息
然后我试了一下:
logger = logging.getLogger('my_module')
logger.setLevel(logging.WARNING)
fh = logging.FileHandler('my_module.log')
fh.setLevel(logging.DEBUG)
logger.addHandler(fh)
logger = logging.getLogger('my_module')
logger.setLevel(logging.DEBUG)
logger.addHandler(logging.NullHandler())
console = logging.StreamHandler()
console.setLevel(logging.WARNING)
logger.addHandler(console)
fh = logging.FileHandler('my_module.log')
fh.setLevel(logging.DEBUG)
logger.addHandler(fh)
但同样没有运气
因此,我可以在不调用basicConfig()或其他任何影响全局日志基础设施的情况下实现这一点吗?如果可能的话,我只想在这里修改我自己的模块
谢谢 尝试创建指向同一文件的两个记录器。一个。错误和一个。警告。从未用Python实现过这一点,但我不明白为什么它不起作用。只要您在写操作之后刷新流,它们就不应该相互干扰,除非您正在运行co例程,在这种情况下,您需要在一些锁等中编程。只要你的程序线性运行,你就不会有任何担心
- 无论主程序(在我的控制之外)将日志配置到哪里,都会出现任何与警告相同或更糟的情况 (通常为标准)
- 其他所有内容(主要是调试消息)都会转到日志文件
您认为模块在这种情况下可以做什么 通常,除了为记录器设置警告级别并添加
NullHandler()
,库代码根本不应配置日志记录
如果您想让主应用程序以一种简单的方式向您提供调试信息,那么请定义一个函数,为您的库配置调试级别日志记录
我不希望库被调试,除了文件,我想在那里看到所有东西 如果无法控制主程序,则不应创建调试文件作为使用_模块的副作用,除非明确要求这样做:
import your_module # in the main application
your_module.get_logger().log_to_file(filename) # without this line your module
# shouldn't create debug files
...
your_module.some_function()
我不确定这个记录器层次结构是如何工作的:我创建的记录器是应用程序配置的根记录器的子级
“
是根记录器'a.b'
是'a'
记录器的子级。但这并不能实现我所希望的。如果我将logger级别设置为DEBUG everything goes to stderr,并且将其设置为WARNING,则所有调试信息都不会进入该文件,这就是我的问题所在。感谢您的回复。如果不可能这样做,那么您建议模块在这种情况下可以做什么?我不太理解您关于为库配置调试的函数的建议。我不希望库被调试,除了文件,我想在那里看到所有东西。我不确定这个记录器层次结构是如何工作的:我创建的记录器是应用程序配置的根记录器的子级?@introiboad:我已经在您的评论中添加了问题的答案。