python - 打印语句不会出现在带有日志记录模块的控制台上

标签 python logging

我在单元测试模块框架中使用以下日志记录代码

logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
handler = logging.FileHandler(output_dir, "w")
handler.setLevel(logging.DEBUG)
formatter = logging.Formatter("%(levelname)s - %(message)s")
handler.setFormatter(formatter)
logger.addHandler(handler)

问题是,当我在代码中使用 print 语句时,这些语句不会在任何地方打印。不在控制台上,也不在输出文件中(尽管我理解为什么这些没有打印在文件中)。

谁能告诉我在控制台打印print语句的原因和解决方法 我正在使用 python 2.7

最佳答案

您没有在任何地方设置 StreamHandler,请修改下面的示例。

import logging
output_dir = "/tmp/somefile"

logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
handler = logging.FileHandler(output_dir, "w")
handler.setLevel(logging.DEBUG)
formatter = logging.Formatter("%(levelname)s - %(message)s")
handler.setFormatter(formatter)
logger.addHandler(handler)

# HERE
ch = logging.StreamHandler()
logger.addHandler(ch)

logger.info("test")
logger.info("test")
logger.info("test")
logger.info("test")

这为我提供了控制台和文件中的输出。

编辑:

不是最好的主意,同意,但直接取自 documentation

import logging
import unittest

logger = None

class TestStringMethods(unittest.TestCase):

    def test_upper(self):
        self.assertEqual('foo'.upper(), 'FOO')
        logger.info(self)
    def test_isupper(self):
        self.assertTrue('FOO'.isupper())
        self.assertFalse('Foo'.isupper())

        logger.info(self)
    def test_split(self):
        s = 'hello world'
        self.assertEqual(s.split(), ['hello', 'world'])
        # check that s.split fails when the separator is not a string
        with self.assertRaises(TypeError):
            s.split(2)

        logger.info(self)

def setup_log():
    global logger
    output_dir = "/tmp/somefile"
    logger = logging.getLogger()
    logger.setLevel(logging.DEBUG)
    handler = logging.FileHandler(output_dir, "w")
    handler.setLevel(logging.DEBUG)
    formatter = logging.Formatter("%(levelname)s - %(message)s")
    handler.setFormatter(formatter)
    logger.addHandler(handler)
    ch = logging.StreamHandler()
    logger.addHandler(ch)
    logger.info("Logger ready")

if __name__ == '__main__':
    setup_log()
    unittest.main()

它有效,所以您的代码中可能还有其他问题,如果您更新了更精细的版本,也许我们可以提供帮助。

关于python - 打印语句不会出现在带有日志记录模块的控制台上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47731201/

相关文章:

logging - NLog:无法写入事件日志

Django 1.3 日志记录 : 500 errors are not logged

python - 我可以将 python **kwargs 从子类传递给父类吗?

python - XML 解析在大(但不是那么大)文件上挂起

python - 根据元素的条件值对 numpy 数组元素进行排序

java - Logback 占位符不适用于测试

java - 使用自己的记录器刷新 System.out

grails 分离信息记录

python - Pandas 数据框的列表列表

python - 将具有多列的子项添加到pyside中的qtreeview