diff --git a/dvc/logger.py b/dvc/logger.py index b90ac6ade..41b2b6f2e 100644 --- a/dvc/logger.py +++ b/dvc/logger.py @@ -54,11 +54,22 @@ class Logger(object): @staticmethod def init(): - sh = logging.StreamHandler(sys.stdout) - sh.setFormatter(logging.Formatter(Logger.FMT)) - sh.setLevel(logging.DEBUG) - Logger.logger().addHandler(sh) + class LogLevelFilter(logging.Filter): + def filter(self, record): + return record.levelno <= logging.WARNING + + sh_out = logging.StreamHandler(sys.stdout) + sh_out.setFormatter(logging.Formatter(Logger.FMT)) + sh_out.setLevel(logging.DEBUG) + sh_out.addFilter(LogLevelFilter()) + + sh_err = logging.StreamHandler(sys.stderr) + sh_err.setFormatter(logging.Formatter(Logger.FMT)) + sh_err.setLevel(logging.ERROR) + + Logger.logger().addHandler(sh_out) + Logger.logger().addHandler(sh_err) Logger.set_level() @staticmethod diff --git a/tests/test_logger.py b/tests/test_logger.py index 596313245..daaf1733b 100644 --- a/tests/test_logger.py +++ b/tests/test_logger.py @@ -1,13 +1,26 @@ +from mock import patch + +try: + from StringIO import StringIO +except ImportError: + from io import StringIO + import colorama import logging from dvc.command.base import CmdBase from dvc.config import Config from dvc.logger import Logger +from dvc.main import main from tests.basic_env import TestDvc +class StringContaining(str): + def __eq__(self, other): + return self in other + + class TestLogger(TestDvc): def test_config(self): Logger('debug') @@ -34,6 +47,28 @@ class TestLogger(TestDvc): # This is not a tty, so it should not colorize anything self.assertEqual(msg, name) + @patch('sys.stderr', new_callable=StringIO) + @patch('sys.stdout', new_callable=StringIO) + def test_stderr(self, mock_stdout, mock_stderr): + error_message = 'error msg' + Logger.init() + Logger.error(error_message) + self.assertEqual('', mock_stdout.getvalue()) + self.assertEqual('Error: {}\n\nHaving any troubles? ' + 'Hit us up at dvc.org/support, we ' + 'are always happy to help!\n'.format(error_message), + mock_stderr.getvalue()) + + @patch('sys.stderr', new_callable=StringIO) + @patch('sys.stdout', new_callable=StringIO) + def test_stdout(self, mock_stdout, mock_stderr): + non_error_message = 'non-error message' + Logger.init() + Logger.info(non_error_message) + self.assertEqual('', mock_stderr.getvalue()) + self.assertEqual('{}\n'.format(non_error_message), + mock_stdout.getvalue()) + class TestLoggerCLI(TestDvc): def test(self):