我想使用日志记录将信息(当前相同的信息)记录到控制台和文件中。
但是,我看到其他多余的信息正在打印到控制台上。
我希望将以下输出输出到控制台和文件:
INFO - thisuser executed the pipeline at 2019-04-17 13:44:50,626
default log message
other default log message
INFO - pipeline execution completed at 2019-04-17 13:44:50,627
INFO - total time elapsed: 100.4 minutes
我在文件中得到了预期的输出,但是控制台输出了以下内容:
INFO:start_log:thisuser
INFO - thisuser executed the pipeline at 2019-04-17 13:44:50,626
INFO:root:default log message
default log message
INFO:root:other default log message
other default log message
INFO:end_log:-
INFO - pipeline execution completed at 2019-04-17 13:44:50,627
INFO:duration_log:100.4
INFO - total time elapsed: 100.4 minutes
我想删除打印到控制台的其他信息(上面的奇数行)。任何帮助将不胜感激!
下面是我正在运行的代码:
import logging
import getpass
class DispatchingFormatter:
def __init__(self, formatters, default_formatter):
self._formatters = formatters
self._default_formatter = default_formatter
def format(self, record):
formatter = self._formatters.get(record.name, self._default_formatter)
return formatter.format(record)
logging.basicConfig(level=logging.INFO)
formatter = DispatchingFormatter({
'start_log': logging.Formatter('%(levelname)s - %(message)s executed the pipeline at %(asctime)s'),
'end_log': logging.Formatter('%(levelname)s - pipeline execution completed at %(asctime)s'),
'duration_log': logging.Formatter('%(levelname)s - total time elapsed: %(message)s minutes')
},
logging.Formatter('%(message)s'),
)
c_handler = logging.StreamHandler()
c_handler.setFormatter(formatter)
f_handler = logging.FileHandler('log.txt')
f_handler.setFormatter(formatter)
logging.getLogger().addHandler(c_handler)
logging.getLogger().addHandler(f_handler)
logging.getLogger('start_log').info(f'{getpass.getuser()}')
logging.info('default log message')
logging.info('other default log message')
logging.getLogger('end_log').info('-')
time_elapsed = 100.4
logging.getLogger('duration_log').info(f'{time_elapsed}')
管道将打印约100行信息(分析结果),我不想在任何日志记录级别之前添加该信息,因此我尝试使用多个格式化程序来实现。
我知道这是一个有点棘手的解决方案。如果有人对改进有一般性建议,也将不胜感激!
答案 0 :(得分:1)
logging.basicConfig
的文档说明:
通过使用默认格式化程序创建StreamHandler并将其添加到根记录器中,对记录系统进行基本配置。
因此已经附加了流处理程序。您可以通过以下方式将其删除:
@@ Saving code size without any other changes
00000000 <function>:
0: 480a ldr r0, [pc, #40] ; (2c <exit+0x4>)
2: f05f 0158 movs.w r1, #88 ; 0x58
6: 2205 movs r2, #5
8: 4b09 ldr r3, [pc, #36] ; (30 <exit+0x8>)
a: 1a89 subs r1, r1, r2
c: d40c bmi.n 28 <exit>
0000000e <filter_loop>:
e: e890 00f4 ldmia.w r0, {r2, r4, r5, r6, r7}
12: 443a add r2, r7
14: 4434 add r4, r6
16: 4414 add r4, r2
18: eb15 0554 adds.w r5, r5, r4, lsr #1
1c: 08ad lsrs r5, r5, #2
1e: c320 stmia r3!, {r5}
20: 3004 adds r0, #4
22: 3901 subs r1, #1
24: d5f3 bpl.n e <filter_loop>
00000026 <exit>:
26: e7fe b.n 26 <exit>
在添加其他处理程序之前。
或者,您可以使用add
代替x[0]
。在这种情况下,您不必清除处理程序,因为默认情况下它们都不附加。
答案 1 :(得分:0)
搜索(Replace default handler of Python logger)并阅读文档(https://docs.python.org/3.7/library/logging.html#)时,发现了一个可行的解决方案。
我正在将两个处理程序(一个以指定格式打印到控制台,另一个以指定格式打印到文件)添加到记录器的默认处理程序,显然记录器的默认处理程序将不需要的行打印到控制台。 / p>
一种解决方案(也许是个笨拙的解决方案)是先执行以下操作以清空处理程序:
logging.basicConfig(level=logging.INFO, filemode='w')
# Added two lines below to first empty out (remove original handler) handlers
root_logger = logging.getLogger()
root_logger.handlers = []
然后继续创建所需的格式化程序对象,并添加两个所需的处理程序(与问题中的代码相同):
formatter = DispatchingFormatter({
'start_log': logging.Formatter('%(levelname)s - %(message)s executed the pipeline at %(asctime)s', datefmt='%Y-%m-%d %H:%M:%S'),
'end_log': logging.Formatter('%(levelname)s - pipeline execution completed at %(asctime)s', datefmt='%Y-%m-%d %H:%M:%S'),
'duration_log': logging.Formatter('%(levelname)s - total time elapsed: %(message)s minutes')
},
logging.Formatter('%(message)s'),
)
c_handler = logging.StreamHandler()
c_handler.setFormatter(formatter)
f_handler = logging.FileHandler('log.txt', 'w+')
f_handler.setFormatter(formatter)
logging.getLogger().addHandler(c_handler)
logging.getLogger().addHandler(f_handler)