Skip to content

Commit

Permalink
conditionally format log_records (#171)
Browse files Browse the repository at this point in the history
  • Loading branch information
braingram authored Jul 25, 2024
2 parents 9952c36 + a81a412 commit ab747f9
Show file tree
Hide file tree
Showing 5 changed files with 32 additions and 18 deletions.
6 changes: 5 additions & 1 deletion CHANGES.rst
Original file line number Diff line number Diff line change
@@ -1,9 +1,13 @@
0.6.1 (unreleased)
0.7.0 (unreleased)
==================

- remove Windows tests and add info box indicating lack of Windows support to README [#163]
- add ``ModelLibrary`` container class [#156]

0.6.1 (unreleased)
==================
- log only strings in ``Step.log_records`` when a formatter is provided [#171]

0.6.0 (2024-01-24)
==================

Expand Down
23 changes: 14 additions & 9 deletions src/stpipe/log.py
Original file line number Diff line number Diff line change
Expand Up @@ -280,18 +280,23 @@ def log_records(self):
return self._log_records

def emit(self, record):
self._log_records.append(record)
if self.formatter is not None:
self._log_records.append(self.formatter.format(record))


@contextmanager
def record_logs(level=logging.NOTSET):
handler = RecordingHandler(level=level)
logger = getLogger(STPIPE_ROOT_LOGGER)
logger.addHandler(handler)
try:
yield handler.log_records
finally:
logger.removeHandler(handler)
def record_logs(level=logging.NOTSET, formatter=None):
if formatter is None:
yield []
else:
handler = RecordingHandler(level=level)
handler.setFormatter(formatter)
logger = getLogger(STPIPE_ROOT_LOGGER)
logger.addHandler(handler)
try:
yield handler.log_records
finally:
logger.removeHandler(handler)


# Install the delegation handler on the root logger. The Step class
Expand Down
8 changes: 6 additions & 2 deletions src/stpipe/step.py
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,10 @@ class Step:
# but by default attempt to prefetch
prefetch_references = True

# This needs to be set to a logging formatter for any
# log_records to be saved.
_log_records_formatter = None

@classmethod
def get_config_reftype(cls):
"""
Expand Down Expand Up @@ -405,7 +409,7 @@ def log_records(self):
Returns
-------
list of logging.LogRecord
list of str
"""
return self._log_records

Expand All @@ -417,7 +421,7 @@ def run(self, *args):
"""
gc.collect()

with log.record_logs() as log_records:
with log.record_logs(formatter=self._log_records_formatter) as log_records:
self._log_records = log_records

# Make generic log messages go to this step's logger
Expand Down
8 changes: 5 additions & 3 deletions tests/test_logger.py
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,9 @@ def test_record_logs():
isinstance(h, stpipe_log.RecordingHandler) for h in root_logger.handlers
)

with stpipe_log.record_logs(level=logging.ERROR) as log_records:
with stpipe_log.record_logs(
level=logging.ERROR, formatter=logging.Formatter("%(message)s")
) as log_records:
stpipe_logger.warning("Warning from stpipe")
stpipe_logger.error("Error from stpipe")
root_logger.warning("Warning from root")
Expand All @@ -67,5 +69,5 @@ def test_record_logs():
root_logger.error("Additional error from root")

assert len(log_records) == 2
assert log_records[0].message == "Error from stpipe"
assert log_records[1].message == "Error from root"
assert log_records[0] == "Error from stpipe"
assert log_records[1] == "Error from root"
5 changes: 2 additions & 3 deletions tests/test_step.py
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ class LoggingPipeline(Pipeline):
str1 = string(default='default')
output_ext = string(default='simplestep')
"""
_log_records_formatter = logging.Formatter("%(message)s")

def process(self):
self.log.warning("This step has called out a warning.")
Expand Down Expand Up @@ -409,6 +410,4 @@ def test_log_records():
pipeline = LoggingPipeline()
pipeline.run()

assert any(
r.message == "This step has called out a warning." for r in pipeline.log_records
)
assert any(r == "This step has called out a warning." for r in pipeline.log_records)

0 comments on commit ab747f9

Please sign in to comment.