扩展Python记录器

时间:2011-09-01 18:26:09

标签: python logging stdout

我正在寻找一种扩展标准python库中定义的logging功能的简单方法。我只想要能够选择我的日志是否也打印到屏幕上。

示例:通常记录您要调用的警告:

logging.basicConfig(level=logging.DEBUG, format='%(asctime)s %(levelname)s: %(message)s', filename='log.log', filemode='w')
logging.warning("WARNING!!!")

这将设置日志的配置并将警告放入日志

我希望有一些类似的话:

logging.warning("WARNING!!!", True)

其中True语句表示日志是否也打印到stdout。

我已经看到了overriding the logger class

的一些实现示例

但我是该语言的新手,并不真正关注正在发生的事情,或者如何实现这个想法。任何帮助将不胜感激:)

3 个答案:

答案 0 :(得分:4)

Python日志记录模块定义了这些类:

发出日志消息的

记录器 将这些消息发送到目的地的处理程序 用于格式化日志消息的格式化程序 过滤日志消息的过滤器

记录器可以包含处理程序。您可以通过调用addHandler()方法添加它们。 处理程序可以包含过滤器格式化程序。您可以分别通过调用addFilter()setFormatter()方法添加它们。

它的工作原理如下:

import logging

# make a logger
main_logger = logging.getLogger("my logger")
main_logger.setLevel(logging.INFO)

# make some handlers
console_handler = logging.StreamHandler() # by default, sys.stderr
file_handler    = logging.FileHandler("my_log_file.txt")

# set logging levels
console_handler.setLevel(logging.WARNING)
file_handler.setLevel(logging.INFO)

# add handlers to logger
main_logger.addHandler(console_handler)
main_logger.addHandler(file_handler)

现在,您可以像这样使用此对象:

main_logger.info("logged in the FILE")
main_logger.warning("logged in the FILE and on the CONSOLE")

如果您只是在计算机上运行python,则可以在交互式控制台中输入上述代码,您应该看到输出。如果您有权在其中创建文件,则日志文件将在当前目录中进行创建。

我希望这有帮助!

答案 1 :(得分:1)

  

处理程序将日志记录(由记录器创建)发送到适当的记录   目的地。

(来自文档:http://docs.python.org/library/logging.html

只需使用日志对象设置多个处理程序,一个用于写入文件,另一个用于写入屏幕。

<强>更新

这是一个示例函数,您可以在类中调用以使用处理程序设置日志记录。

def set_up_logger(self):
    # create logger object
    self.log = logging.getLogger("command")
    self.log.setLevel(logging.DEBUG)

    # create console handler and set min level recorded to debug messages
    ch = logging.StreamHandler()
    ch.setLevel(logging.DEBUG)

    # add the handler to the log object        
    self.log.addHandler(ch)

您只需要为文件设置另一个处理程序,即已经存在的StreamHandler代码,并将其添加到日志对象中。显示ch.setLevel(logging.DEBUG)的行意味着此特定处理程序将采用DEBUG或更高版本的日志消息。您可能希望将自己设置为WARNING或更高,因为您只希望将更重要的事情发送到控制台。因此,您的日志记录将如下所示:

self.log.info("Hello, World!") -> goes to file
self.log.error("OMG!!") -> goes to file AND console

答案 2 :(得分:1)

可以覆盖logging.getLoggerClass()以向记录器添加新功能。我写了一个简单的类,它在stdout中打印绿色消息。

我的代码中最重要的部分:

class ColorLogger(logging.getLoggerClass()):
    __GREEN = '\033[0;32m%s\033[0m'
    __FORMAT = {
        'fmt': '%(asctime)s %(levelname)s: %(message)s',
        'datefmt': '%Y-%m-%d %H:%M:%S',
    }

    def __init__(self, format=__FORMAT):
        formatter = logging.Formatter(**format)

        self.root.setLevel(logging.INFO)
        self.root.handlers = []

        (...)

        handler = logging.StreamHandler()
        handler.setFormatter(formatter)
        self.root.addHandler(handler)

    def info(self, message):
        self.root.info(message)

    (...)

    def info_green(self, message):
        self.root.info(self.__GREEN, message)

(...)

if __name__ == '__main__':
    logger = ColorLogger()
    logger.info("This message has default color.")
    logger.info_green("This message is green.")