首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >扩展Python Logger

扩展Python Logger
EN

Stack Overflow用户
提问于 2011-09-02 02:26:09
回答 3查看 6.9K关注 0票数 3

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

示例:通常情况下,要记录警告,您可以调用:

代码语言:javascript
复制
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s %(levelname)s: %(message)s', filename='log.log', filemode='w')
logging.warning("WARNING!!!")

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

我想要一些类似于呼叫的东西,比如:

代码语言:javascript
复制
logging.warning("WARNING!!!", True)

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

我见过一些overriding the logger class实现的示例

但是我对这门语言是个新手,并不了解它是怎么回事,也不知道如何实现这个想法。任何帮助都将不胜感激:)

EN

回答 3

Stack Overflow用户

发布于 2011-10-27 23:40:49

Python日志记录模块定义了以下类:

发出日志消息的记录器

将这些消息发送到目的地的处理程序

格式化日志消息的格式

筛选器过滤日志消息的

记录器可以具有Handler。您可以通过调用addHandler()方法添加它们。处理程序可以有FiltersFormatters。您可以通过分别调用addFilter()setFormatter()方法来添加它们。

它是这样工作的:

代码语言:javascript
复制
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)

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

代码语言:javascript
复制
main_logger.info("logged in the FILE")
main_logger.warning("logged in the FILE and on the CONSOLE")

如果您只是在您的机器上运行python,那么您可以在交互式控制台中输入上述代码,您应该会看到输出。如果您有在当前目录中创建文件的权限,日志文件将被创建在当前目录中。

我希望这能帮到你!

票数 7
EN

Stack Overflow用户

发布于 2015-09-02 18:41:58

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

我代码中最重要的部分:

代码语言:javascript
复制
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.")
票数 2
EN

Stack Overflow用户

发布于 2011-09-02 02:28:11

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

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

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

更新

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

代码语言:javascript
复制
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)的行表示此特定处理程序将接受调试或更高级别的日志记录消息。您可能希望将您的设置为WARNING或更高,因为您只希望将更重要的内容转到控制台。因此,您的日志记录的工作方式如下:

代码语言:javascript
复制
self.log.info("Hello, World!") -> goes to file
self.log.error("OMG!!") -> goes to file AND console
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7274732

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档