Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Python记录器记录到文件和stderr_Python_Logging_Python 2.7 - Fatal编程技术网

使用Python记录器记录到文件和stderr

使用Python记录器记录到文件和stderr,python,logging,python-2.7,Python,Logging,Python 2.7,我正在尝试向使用标准Python(2.7)日志库的项目添加一个模块。我希望实现以下目标: 无论主程序(在我的控制之外)将日志配置到哪里(通常是stderr),都会出现任何与警告相同或更糟的情况 其他所有内容(主要是调试消息)都会进入日志文件 请注意,这里的关键问题是我不想修改全局日志记录设置,因为这些设置由主应用程序控制。否则,我将使用这里的示例: 我试过这个: logger = logging.getLogger('my_module') logger.setLevel(logging.

我正在尝试向使用标准Python(2.7)日志库的项目添加一个模块。我希望实现以下目标:

  • 无论主程序(在我的控制之外)将日志配置到哪里(通常是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例程,在这种情况下,您需要在一些锁等中编程。只要你的程序线性运行,你就不会有任何担心

  • 无论主程序(在我的控制之外)将日志配置到哪里,都会出现任何与警告相同或更糟的情况 (通常为标准)
  • 其他所有内容(主要是调试消息)都会转到日志文件
如果不在祖先的处理程序上设置警告级别,则无法使用单个记录器完成此操作。发件人:

如果计算结果为true,则日志消息将由此记录器及其子记录器传递给更高级别的处理程序 (祖先)伐木工人。消息直接传递给祖先 Logger的处理程序-既不是祖先的级别也不是筛选器 有问题的伐木工人被考虑在内


您认为模块在这种情况下可以做什么

通常,除了为记录器设置警告级别并添加
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:我已经在您的评论中添加了问题的答案。