Skip to content

Commit 651ce60

Browse files
committed
Improve logging
* Proper logging setup instead of basicConfig() * INFO and below to stdout, WARNING and above to stderr
1 parent 06c2c76 commit 651ce60

2 files changed

Lines changed: 36 additions & 12 deletions

File tree

src/pdfbaker/baker.py

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,14 @@
66
bake() delegates to its documents and reports back the end result.
77
"""
88

9-
import logging
109
from dataclasses import dataclass
1110
from pathlib import Path
1211
from typing import Any
1312

1413
from .config import PDFBakerConfiguration, deep_merge
1514
from .document import PDFBakerDocument
1615
from .errors import ConfigurationError
17-
from .logging import TRACE, LoggingMixin
16+
from .logging import LoggingMixin, setup_logging
1817

1918
__all__ = ["PDFBaker", "PDFBakerOptions"]
2019

@@ -86,16 +85,7 @@ def __init__(
8685
"""
8786
super().__init__()
8887
options = options or PDFBakerOptions()
89-
90-
logging.basicConfig(level=logging.INFO, format="%(levelname)s: %(message)s")
91-
if options.quiet:
92-
logging.getLogger().setLevel(logging.ERROR)
93-
elif options.trace:
94-
logging.getLogger().setLevel(TRACE)
95-
elif options.verbose:
96-
logging.getLogger().setLevel(logging.DEBUG)
97-
else:
98-
logging.getLogger().setLevel(logging.INFO)
88+
setup_logging(quiet=options.quiet, trace=options.trace, verbose=options.verbose)
9989
self.keep_build = options.keep_build
10090

10191
base_config = DEFAULT_BAKER_CONFIG.copy()

src/pdfbaker/logging.py

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
"""Logging mixin for pdfbaker classes."""
22

33
import logging
4+
import sys
45
from typing import Any
56

67
TRACE = 5
78
logging.addLevelName(TRACE, "TRACE")
89

10+
__all__ = ["LoggingMixin", "setup_logging", "truncate_strings"]
11+
912

1013
class LoggingMixin:
1114
"""Mixin providing consistent logging functionality across pdfbaker classes."""
@@ -71,6 +74,37 @@ def log_critical(self, msg: str, *args: Any, **kwargs: Any) -> None:
7174
self.logger.critical(msg, *args, **kwargs)
7275

7376

77+
def setup_logging(quiet=False, trace=False, verbose=False) -> None:
78+
"""Set up logging for the application."""
79+
logger = logging.getLogger()
80+
logger.setLevel(logging.INFO)
81+
formatter = logging.Formatter("%(levelname)s: %(message)s")
82+
83+
# stdout handler for TRACE/DEBUG/INFO
84+
stdout_handler = logging.StreamHandler(sys.stdout)
85+
stdout_handler.setFormatter(formatter)
86+
stdout_handler.setLevel(TRACE)
87+
stdout_handler.addFilter(lambda record: record.levelno < logging.WARNING)
88+
89+
# stderr handler for WARNING and above
90+
stderr_handler = logging.StreamHandler(sys.stderr)
91+
stderr_handler.setFormatter(formatter)
92+
stderr_handler.setLevel(logging.WARNING)
93+
94+
logger.handlers.clear()
95+
logger.addHandler(stdout_handler)
96+
logger.addHandler(stderr_handler)
97+
98+
if quiet:
99+
logger.setLevel(logging.ERROR)
100+
elif trace:
101+
logger.setLevel(TRACE)
102+
elif verbose:
103+
logger.setLevel(logging.DEBUG)
104+
else:
105+
logger.setLevel(logging.INFO)
106+
107+
74108
def truncate_strings(obj, max_chars: int) -> Any:
75109
"""Recursively truncate strings in nested structures."""
76110
if isinstance(obj, str):

0 commit comments

Comments
 (0)