log.(add|rm)_capture_stream(): Add functions

Add functions log.(add|rm)_capture_stream(). The functions are meant
to capture everything passed to syslog into the stream objects
installed by it. Not sure about future semantics changes:
add_capture_stream() takes a currently unused flags argument, and it
suppresses everything else logged until the stream is removed again.

Signed-off-by: Jan Lindemann <jan@janware.com>
This commit is contained in:
Jan Lindemann 2025-06-03 15:25:44 +02:00
commit 6e70529f7a

View file

@ -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,6 +189,11 @@ def slog(prio: int, *args, only_printable: bool=False, **kwargs) -> None: # expo
return
files = []
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)