diff --git a/tools/python/jwutils/log.py b/tools/python/jwutils/log.py index bd32f2b..56990a7 100644 --- a/tools/python/jwutils/log.py +++ b/tools/python/jwutils/log.py @@ -1,11 +1,11 @@ from __future__ import print_function -import syslog -import sys -import inspect -import re + +from typing import List, Tuple, Optional, Any + +import sys, re, io, syslog, inspect + from os.path import basename from datetime import datetime -from typing import List, Tuple, Optional, Any from . import misc # --- python 2 / 3 compatibility stuff @@ -90,6 +90,23 @@ _prio_colors = { EMERG : [ CONSOLE_FONT_BOLD + CONSOLE_FONT_MAGENTA, CONSOLE_FONT_OFF ], } +class Stream: + def __init__(self, stream, flags): + self.stream = stream + self.flags = flags + +_streams: dict[int, io.IOBase] = dict() +_stream_descriptors = [reversed(range(1, 16))] + +def add_capture_stream(stream, flags=0x0): + ret = _stream_descriptors.pop() + _streams[ret] = Stream(stream=stream, flags=flags) + return ret + +def rm_capture_stream(sd): + del _streams[sd] + _stream_descriptors.append(sd) + def prio_gets_logged(prio: int) -> bool: # export if prio > _level: return False @@ -172,14 +189,19 @@ def slog(prio: int, *args, only_printable: bool=False, **kwargs) -> None: # expo return files = [] - if f_stdout in _flags: - files.append(sys.stdout) + if 'capture' in kwargs: + files.append(kwargs['capture']) + elif _streams: + files = [s.stream for s in _streams.values()] + else: + if f_stdout in _flags: + files.append(sys.stdout) - if f_stderr in _flags: - files.append(sys.stderr) + if f_stderr in _flags: + files.append(sys.stderr) - if not len(files): - files = [ sys.stdout ] + if not len(files): + files = [ sys.stdout ] for file in files: print(msg, file=file)