我正在寻找一种扩展标准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
的一些实现示例但我是该语言的新手,并不真正关注正在发生的事情,或者如何实现这个想法。任何帮助将不胜感激:)
答案 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.")