mirror of
https://github.com/sphinx-doc/sphinx.git
synced 2025-02-25 18:55:22 -06:00
logging.info() supports verbosity filter by app.verbosity
This commit is contained in:
parent
f23a4c6c92
commit
7358512f11
@ -13,6 +13,7 @@ from __future__ import absolute_import
|
|||||||
import logging
|
import logging
|
||||||
import logging.handlers
|
import logging.handlers
|
||||||
from contextlib import contextmanager
|
from contextlib import contextmanager
|
||||||
|
from collections import defaultdict
|
||||||
|
|
||||||
from six import PY2, StringIO, string_types
|
from six import PY2, StringIO, string_types
|
||||||
from docutils.utils import get_source_line
|
from docutils.utils import get_source_line
|
||||||
@ -27,6 +28,17 @@ if False:
|
|||||||
from sphinx.application import Sphinx # NOQA
|
from sphinx.application import Sphinx # NOQA
|
||||||
|
|
||||||
|
|
||||||
|
VERBOSE = 15
|
||||||
|
DEBUG2 = 5
|
||||||
|
VERBOSITY_MAP = defaultdict(lambda: 0) # type: Dict[int, int]
|
||||||
|
VERBOSITY_MAP.update({
|
||||||
|
0: logging.INFO,
|
||||||
|
1: VERBOSE,
|
||||||
|
2: logging.DEBUG,
|
||||||
|
3: DEBUG2,
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
def getLogger(name):
|
def getLogger(name):
|
||||||
# type: (str) -> SphinxLoggerAdapter
|
# type: (str) -> SphinxLoggerAdapter
|
||||||
"""Get logger wrapped by SphinxLoggerAdapter."""
|
"""Get logger wrapped by SphinxLoggerAdapter."""
|
||||||
@ -72,6 +84,14 @@ class SphinxLoggerAdapter(logging.LoggerAdapter):
|
|||||||
|
|
||||||
self.warning(message, **kwargs)
|
self.warning(message, **kwargs)
|
||||||
|
|
||||||
|
def verbose(self, msg, *args, **kwargs):
|
||||||
|
# type: (unicode, Any, Any) -> None
|
||||||
|
self.log(VERBOSE, msg, *args, **kwargs)
|
||||||
|
|
||||||
|
def debug2(self, msg, *args, **kwargs):
|
||||||
|
# type: (unicode, Any, Any) -> None
|
||||||
|
self.log(DEBUG2, msg, *args, **kwargs)
|
||||||
|
|
||||||
def process(self, msg, kwargs): # type: ignore
|
def process(self, msg, kwargs): # type: ignore
|
||||||
# type: (unicode, Dict) -> Tuple[unicode, Dict]
|
# type: (unicode, Dict) -> Tuple[unicode, Dict]
|
||||||
extra = kwargs.setdefault('extra', {})
|
extra = kwargs.setdefault('extra', {})
|
||||||
@ -285,6 +305,7 @@ def setup(app, status, warning):
|
|||||||
|
|
||||||
info_handler = NewLineStreamHandler(status)
|
info_handler = NewLineStreamHandler(status)
|
||||||
info_handler.addFilter(InfoFilter())
|
info_handler.addFilter(InfoFilter())
|
||||||
|
info_handler.setLevel(VERBOSITY_MAP.get(app.verbosity))
|
||||||
|
|
||||||
warning_handler = logging.StreamHandler(warning)
|
warning_handler = logging.StreamHandler(warning)
|
||||||
warning_handler.addFilter(WarningSuppressor(app))
|
warning_handler.addFilter(WarningSuppressor(app))
|
||||||
|
@ -21,6 +21,7 @@ from util import with_app, raises, strip_escseq
|
|||||||
|
|
||||||
@with_app()
|
@with_app()
|
||||||
def test_info_and_warning(app, status, warning):
|
def test_info_and_warning(app, status, warning):
|
||||||
|
app.verbosity = 3
|
||||||
logging.setup(app, status, warning)
|
logging.setup(app, status, warning)
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
@ -43,6 +44,69 @@ def test_info_and_warning(app, status, warning):
|
|||||||
assert 'message5' in warning.getvalue()
|
assert 'message5' in warning.getvalue()
|
||||||
|
|
||||||
|
|
||||||
|
@with_app()
|
||||||
|
def test_verbosity_filter(app, status, warning):
|
||||||
|
# verbosity = 0: INFO
|
||||||
|
app.verbosity = 0
|
||||||
|
logging.setup(app, status, warning)
|
||||||
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
logger.info('message1')
|
||||||
|
logger.verbose('message2')
|
||||||
|
logger.debug('message3')
|
||||||
|
logger.debug2('message4')
|
||||||
|
|
||||||
|
assert 'message1' in status.getvalue()
|
||||||
|
assert 'message2' not in status.getvalue()
|
||||||
|
assert 'message3' not in status.getvalue()
|
||||||
|
assert 'message4' not in status.getvalue()
|
||||||
|
|
||||||
|
# verbosity = 1: VERBOSE
|
||||||
|
app.verbosity = 1
|
||||||
|
logging.setup(app, status, warning)
|
||||||
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
logger.info('message1')
|
||||||
|
logger.verbose('message2')
|
||||||
|
logger.debug('message3')
|
||||||
|
logger.debug2('message4')
|
||||||
|
|
||||||
|
assert 'message1' in status.getvalue()
|
||||||
|
assert 'message2' in status.getvalue()
|
||||||
|
assert 'message3' not in status.getvalue()
|
||||||
|
assert 'message4' not in status.getvalue()
|
||||||
|
|
||||||
|
# verbosity = 2: DEBUG
|
||||||
|
app.verbosity = 2
|
||||||
|
logging.setup(app, status, warning)
|
||||||
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
logger.info('message1')
|
||||||
|
logger.verbose('message2')
|
||||||
|
logger.debug('message3')
|
||||||
|
logger.debug2('message4')
|
||||||
|
|
||||||
|
assert 'message1' in status.getvalue()
|
||||||
|
assert 'message2' in status.getvalue()
|
||||||
|
assert 'message3' in status.getvalue()
|
||||||
|
assert 'message4' not in status.getvalue()
|
||||||
|
|
||||||
|
# verbosity = 3: DEBUG2
|
||||||
|
app.verbosity = 3
|
||||||
|
logging.setup(app, status, warning)
|
||||||
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
logger.info('message1')
|
||||||
|
logger.verbose('message2')
|
||||||
|
logger.debug('message3')
|
||||||
|
logger.debug2('message4')
|
||||||
|
|
||||||
|
assert 'message1' in status.getvalue()
|
||||||
|
assert 'message2' in status.getvalue()
|
||||||
|
assert 'message3' in status.getvalue()
|
||||||
|
assert 'message4' in status.getvalue()
|
||||||
|
|
||||||
|
|
||||||
@with_app()
|
@with_app()
|
||||||
def test_nonl_info_log(app, status, warning):
|
def test_nonl_info_log(app, status, warning):
|
||||||
logging.setup(app, status, warning)
|
logging.setup(app, status, warning)
|
||||||
|
Loading…
Reference in New Issue
Block a user