我正在尝试将模块添加到使用标准Python(2.7)日志库的项目中。我想要实现的目标如下:
请注意,此处的关键问题是我不想修改全局日志记录设置,因为这些设置由主应用程序控制。否则我会在这里使用这个例子:
http://docs.python.org/2/howto/logging-cookbook.html#logging-to-multiple-destinations
我试过这个:
logger = logging.getLogger('my_module')
logger.setLevel(logging.WARNING)
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.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()或其他任何影响全局日志记录基础结构的情况下实现此目的?我想在可能的情况下修改我自己的模块。
谢谢!
答案 0 :(得分:2)
- 与WARNING相同或更差的任何内容都会转到主程序(我无法控制)配置日志记录的任何地方 (通常是stderr)
- 其他所有内容(主要是调试消息)转到日志文件
如果没有在祖先的处理程序上设置WARNING级别,则无法使用单个记录器执行此操作。来自the docs:
Logger.propagate
如果此计算结果为true,则此记录器及其子记录器将记录消息传递给更高级别的处理程序 (祖先)记录器。消息直接传递给祖先 记录器的处理程序 - 既不是祖先的级别也不是过滤器 有问题的伐木工人被考虑。
在这种情况下,您建议模块可以做什么?
除了设置记录器的警告级别并添加NullHandler()
之外,库代码根本不应配置日志记录。
如果您想为主应用程序提供一种简单的方法来为您提供调试信息,那么请定义一个为您的库配置DEBUG级别日志记录的函数。
我不希望该库除了文件之外是DEBUG,我希望看到所有内容。
如果你无法控制主程序,那么你不应该创建调试文件作为使用your_module的副作用,除非明确要求这样做:
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'
记录器的孩子。
答案 1 :(得分:0)
尝试创建指向同一文件的两个记录器。一个.ERROR和一个。警告。从来没有用Python做过这个,但我不明白为什么它不起作用。只要你在写入后刷新你的流,它们就不应该相互干扰,除非你正在运行协同例程,在这种情况下你需要编写一些锁等等。只要您的程序线性运行,您就不会有任何后顾之忧。