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

时间:2017-12-09 17:28:05

标签: python logging

我在unittest模块框架中使用以下日志记录代码

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

1 个答案:

答案 0 :(得分:1)

您没有在任何地方设置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()

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