python日志记录模块将其他信息输出到控制台

时间:2019-04-17 17:52:42

标签: python python-3.x logging output formatter

我想使用日志记录将信息(当前相同的信息)记录到控制台和文件中。

但是,我看到其他多余的信息正在打印到控制台上。

我希望将以下输出输出到控制台和文件:

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行信息​​(分析结果),我不想在任何日志记录级别之前添加该信息,因此我尝试使用多个格式化程序来实现。

我知道这是一个有点棘手的解决方案。如果有人对改进有一般性建议,也将不胜感激!

2 个答案:

答案 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)