Skip to content

Commit 171ae75

Browse files
committed
SCANPY-180 The scanner should not publish non-error logs to stderr
1 parent aa51f25 commit 171ae75

2 files changed

Lines changed: 50 additions & 1 deletion

File tree

src/pysonar_scanner/app_logging.py

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,34 @@
1818
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
1919
#
2020
import logging
21+
import sys
22+
23+
24+
class LevelFilter(logging.Filter):
25+
def __init__(self, level):
26+
super().__init__()
27+
self.__level = level
28+
29+
def filter(self, record):
30+
return record.levelno < self.__level
2131

2232

2333
def setup() -> None:
24-
logging.basicConfig(level=logging.INFO, format="%(levelname)s: %(message)s")
34+
logger = logging.getLogger()
35+
36+
non_error_handler = logging.StreamHandler(sys.stdout)
37+
non_error_handler.setLevel(logging.DEBUG)
38+
non_error_handler.addFilter(LevelFilter(logging.ERROR))
39+
40+
error_handler = logging.StreamHandler(sys.stderr)
41+
error_handler.setLevel(logging.ERROR)
42+
43+
formatter = logging.Formatter("%(levelname)s: %(message)s")
44+
non_error_handler.setFormatter(formatter)
45+
error_handler.setFormatter(formatter)
46+
47+
logger.addHandler(non_error_handler)
48+
logger.addHandler(error_handler)
2549

2650

2751
def configure_logging_level(verbose: bool) -> None:

tests/unit/test_app_logging.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import logging
2+
import unittest
3+
4+
import pytest
5+
6+
from pysonar_scanner import app_logging
7+
8+
9+
class TestAppLogging(unittest.TestCase):
10+
@pytest.fixture(autouse=True)
11+
def set_capsys(self, capsys):
12+
self.capsys = capsys
13+
14+
def setUp(self) -> None:
15+
app_logging.setup()
16+
17+
def test_logging_output_destinations(self):
18+
logging.info("hello world")
19+
logging.error("boom!")
20+
21+
captured = self.capsys.readouterr()
22+
self.assertIn("INFO: hello world", captured.out)
23+
self.assertIn("ERROR: boom!", captured.err)
24+
self.assertEqual(len(captured.err.splitlines()), 1)
25+
self.assertEqual(len(captured.out.splitlines()), 1)

0 commit comments

Comments
 (0)