logger-36 2025.28__py3-none-any.whl → 2025.29__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- logger_36/catalog/logger/chronos.py +15 -11
- logger_36/type/logger.py +29 -20
- logger_36/version.py +1 -1
- {logger_36-2025.28.dist-info → logger_36-2025.29.dist-info}/METADATA +1 -1
- {logger_36-2025.28.dist-info → logger_36-2025.29.dist-info}/RECORD +7 -7
- {logger_36-2025.28.dist-info → logger_36-2025.29.dist-info}/WHEEL +0 -0
- {logger_36-2025.28.dist-info → logger_36-2025.29.dist-info}/top_level.txt +0 -0
@@ -13,6 +13,11 @@ from logger_36.task.measure.chronos import FormattedElapsedTime
|
|
13
13
|
from logger_36.type.logger import logger_t
|
14
14
|
|
15
15
|
|
16
|
+
_START_NAME = "START"
|
17
|
+
_START_PLACEHOLDER = "..." # Must not be longer than _START_NAME.
|
18
|
+
_END_NAME = "END"
|
19
|
+
|
20
|
+
|
16
21
|
def LogElapsedTime(*, logger: logger_t = L) -> None:
|
17
22
|
""""""
|
18
23
|
now = date_time_t.now()
|
@@ -24,21 +29,20 @@ def LogElapsedTime(*, logger: logger_t = L) -> None:
|
|
24
29
|
if logger.intermediate_times.__len__() > 0:
|
25
30
|
intermediate_e_times = []
|
26
31
|
for (start_name, start_time), (end_name, end_time) in zip(
|
27
|
-
[(
|
28
|
-
logger.intermediate_times + [(
|
32
|
+
[(_START_NAME, START_DATE_TIME)] + logger.intermediate_times,
|
33
|
+
logger.intermediate_times + [(_END_NAME, now)],
|
29
34
|
strict=True,
|
30
35
|
):
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
end_time, reference=start_time, with_separator=False
|
36
|
-
),
|
37
|
-
)
|
36
|
+
if start_name != _START_NAME:
|
37
|
+
start_name = _START_PLACEHOLDER
|
38
|
+
e_time = FormattedElapsedTime(
|
39
|
+
end_time, reference=start_time, with_separator=False
|
38
40
|
)
|
39
|
-
|
41
|
+
intermediate_e_times.append((start_name, end_name, e_time))
|
42
|
+
max_length_end = max(map(len, (_[1] for _ in intermediate_e_times)))
|
40
43
|
intermediate_e_times = "\n ".join(
|
41
|
-
f"{_: <{
|
44
|
+
f"{_: <{_START_NAME.__len__()}} → {__: <{max_length_end}} +{___}"
|
45
|
+
for _, __, ___ in intermediate_e_times
|
42
46
|
)
|
43
47
|
message += "\n " + intermediate_e_times
|
44
48
|
logger.intermediate_times.clear()
|
logger_36/type/logger.py
CHANGED
@@ -112,6 +112,7 @@ class logger_t(base_t):
|
|
112
112
|
# Used only until the first handler is added (see AddHandler).
|
113
113
|
_should_activate_log_interceptions: bool = d.field(init=False, default=False)
|
114
114
|
|
115
|
+
server_handlers: tuple[l.Handler,...]|None = d.field(init=False, default=None)
|
115
116
|
log_server: log_server_t | None = d.field(init=False, default=None)
|
116
117
|
|
117
118
|
name_: d.InitVar[str | None] = None
|
@@ -432,9 +433,12 @@ class logger_t(base_t):
|
|
432
433
|
handler). If handlers are added passed this call, execution might freeze or
|
433
434
|
crash.
|
434
435
|
"""
|
435
|
-
assert
|
436
|
+
assert prll.current_process().name == MAIN_PROCESS_NAME
|
436
437
|
assert self.hasHandlers()
|
437
438
|
|
439
|
+
if self.log_server is not None:
|
440
|
+
return
|
441
|
+
|
438
442
|
handlers = tuple(self.handlers) # Making a copy is necessary.
|
439
443
|
for handler in handlers:
|
440
444
|
self.removeHandler(handler)
|
@@ -443,9 +447,31 @@ class logger_t(base_t):
|
|
443
447
|
|
444
448
|
self.addHandler(queue_handler_t(queue))
|
445
449
|
|
446
|
-
self.
|
450
|
+
self.server_handlers = handlers
|
451
|
+
self.log_server = log_server_t(queue, *handlers, respect_handler_level=True)
|
447
452
|
self.log_server.start()
|
448
453
|
|
454
|
+
def RemoveMultiSafety(self) -> None:
|
455
|
+
"""
|
456
|
+
Calling this method automatically as an atexit-registered function does not
|
457
|
+
flush the enqueued log records. It is probably too late then for this. Hence, if
|
458
|
+
MakeMultiSafe has been called, this method should also be called before the
|
459
|
+
execution ends.
|
460
|
+
"""
|
461
|
+
assert prll.current_process().name == MAIN_PROCESS_NAME
|
462
|
+
|
463
|
+
if self.log_server is None:
|
464
|
+
return
|
465
|
+
|
466
|
+
self.log_server.stop()
|
467
|
+
|
468
|
+
for handler in self.handlers: # There is only the QueueHandler, actually.
|
469
|
+
self.removeHandler(handler)
|
470
|
+
for handler in self.server_handlers:
|
471
|
+
self.addHandler(handler)
|
472
|
+
|
473
|
+
self.server_handlers = self.log_server = None
|
474
|
+
|
449
475
|
def __call__(self, *args, **kwargs) -> None:
|
450
476
|
"""
|
451
477
|
For a print-like calling for print-based debugging.
|
@@ -513,7 +539,7 @@ class logger_t(base_t):
|
|
513
539
|
message = "\n".join(lines[:1] + lines[2:])
|
514
540
|
else:
|
515
541
|
# TODO: Explain:
|
516
|
-
# - Why it
|
542
|
+
# - Why is it not: "\n".join(lines)?
|
517
543
|
# - Why adding exception name here and not when removing caller?
|
518
544
|
formatted = "".join(lines)
|
519
545
|
message = f"Exception of type {type(exception).__name__}\n----\n{formatted}"
|
@@ -544,11 +570,6 @@ class logger_t(base_t):
|
|
544
570
|
}
|
545
571
|
)
|
546
572
|
base_t.handle(self, record)
|
547
|
-
# emit_rule_name = handler_extension_t.EmitRule.__name__
|
548
|
-
# for handler in self.handlers:
|
549
|
-
# EmitRule = getattr(handler, emit_rule_name, None)
|
550
|
-
# if EmitRule is not None:
|
551
|
-
# EmitRule(text=message, color=color)
|
552
573
|
|
553
574
|
def AddContextLevel(self, new_level: str, /) -> None:
|
554
575
|
""""""
|
@@ -706,18 +727,6 @@ class logger_t(base_t):
|
|
706
727
|
_ = self.context_levels.pop()
|
707
728
|
return False
|
708
729
|
|
709
|
-
def __del__(self) -> None:
|
710
|
-
""""""
|
711
|
-
for handler in self.handlers:
|
712
|
-
handler.flush()
|
713
|
-
|
714
|
-
if (
|
715
|
-
(prll.current_process is not None)
|
716
|
-
and (prll.current_process().name == MAIN_PROCESS_NAME)
|
717
|
-
and (self.log_server is not None)
|
718
|
-
):
|
719
|
-
self.log_server.stop()
|
720
|
-
|
721
730
|
|
722
731
|
def _HandleForWarnings(interceptor: base_t, /) -> logger_handle_h:
|
723
732
|
""""""
|
logger_36/version.py
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
logger_36/__init__.py,sha256=mK6AD0eWI2Sk42oxleTvsxzYJ28FbHK5WNkpLgAhnNE,2129
|
2
|
-
logger_36/version.py,sha256=
|
2
|
+
logger_36/version.py,sha256=LkNv8XLYRUZyEvbPeeVEFJu6pnOTpe4z98xWqxjSMYA,1680
|
3
3
|
logger_36/api/chronos.py,sha256=o_UMZbeExjb01aNURmzIjOMAHhI9e90nyvJJYcJR6VQ,1739
|
4
4
|
logger_36/api/logger.py,sha256=eLZ2yuH-sYeh4Z2KnAwTRJEbmkmgzBPMncdqXfFUTG8,1760
|
5
5
|
logger_36/api/memory.py,sha256=U4mMEkx8WRHk9q2d3SCFGt2EJaBuflOXw2bGbAxOnSc,1828
|
@@ -12,7 +12,7 @@ logger_36/catalog/handler/console_rich.py,sha256=PSHsul03HNjQR8GmQVU3Z0DNNaudOYN
|
|
12
12
|
logger_36/catalog/handler/file.py,sha256=5GR_aACDEBXuZ-pUH9P0OCaXbCf-aLPmsz-XrGCAIgE,2434
|
13
13
|
logger_36/catalog/handler/generic.py,sha256=HhBtM3JZBJjW2OLALnxdoWLsFs6J-AMzyFwwUs-woIA,7046
|
14
14
|
logger_36/catalog/handler/memory.py,sha256=pJwKOlCm8Ej8ipDI00-FfX4qJjMPXJb-DucD1ukIQOU,4057
|
15
|
-
logger_36/catalog/logger/chronos.py,sha256=
|
15
|
+
logger_36/catalog/logger/chronos.py,sha256=cVaU1Znda-vmwLcaimrZusInmbcgxFxcQnQgItou8Ro,3398
|
16
16
|
logger_36/catalog/logger/gpu.py,sha256=Py5YY0nD_pqJzJsEKQYoOGHcPqyNVJ3J2noOS3hDL6g,2890
|
17
17
|
logger_36/catalog/logger/memory.py,sha256=pa-9pkvDGdf52giwL3Zi1mjWNFE_NVzBGdjwcfeIDNc,4256
|
18
18
|
logger_36/catalog/logger/system.py,sha256=zEbHirATqZAVYFmHLd0pppeuRhka1ucWwyHRq0afQNE,2593
|
@@ -45,9 +45,9 @@ logger_36/task/measure/chronos.py,sha256=nlyPUebI_cJSU_aUvbunE1gs7ozP5lZg9D_yJ_i
|
|
45
45
|
logger_36/task/measure/memory.py,sha256=kkPHEIUTUhkCOLrAt01eLJLnsnkl0nFPNhFZdIB_JAw,1991
|
46
46
|
logger_36/type/handler.py,sha256=8ufQEjfIIk63rBTu0B-LF67x_UKDuFvnzC3g7CnfK18,6666
|
47
47
|
logger_36/type/issue.py,sha256=M2KeQwzDG9yqgdtbyWk5Y-ier7c71TuAKlNCf5QCGzY,2770
|
48
|
-
logger_36/type/logger.py,sha256=
|
48
|
+
logger_36/type/logger.py,sha256=xa30O5nehZ4NtSuaL2R5jeEInm_mwi6FhvNRMLVKRSU,28222
|
49
49
|
logger_36/type/loggers.py,sha256=tFcuso9KGLDHnFfCaEJTDukUyYnbZEZrffpm59SDYO0,3067
|
50
|
-
logger_36-2025.
|
51
|
-
logger_36-2025.
|
52
|
-
logger_36-2025.
|
53
|
-
logger_36-2025.
|
50
|
+
logger_36-2025.29.dist-info/METADATA,sha256=1kPTP62de8MalmTwkSepX8JWXqSizKys4iGKDKFGDc0,5980
|
51
|
+
logger_36-2025.29.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
52
|
+
logger_36-2025.29.dist-info/top_level.txt,sha256=sM95BTMWmslEEgR_1pzwZsOeSp8C_QBiu8ImbFr0XLc,10
|
53
|
+
logger_36-2025.29.dist-info/RECORD,,
|
File without changes
|
File without changes
|