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.
@@ -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
- [("START", START_DATE_TIME)] + logger.intermediate_times,
28
- logger.intermediate_times + [("END", now)],
32
+ [(_START_NAME, START_DATE_TIME)] + logger.intermediate_times,
33
+ logger.intermediate_times + [(_END_NAME, now)],
29
34
  strict=True,
30
35
  ):
31
- intermediate_e_times.append(
32
- (
33
- f"{start_name} {end_name}",
34
- FormattedElapsedTime(
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
- max_length = max(map(len, (_[0] for _ in intermediate_e_times)))
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"{_: <{max_length}} +{__}" for _, __ in intermediate_e_times
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 self.log_server is None
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.log_server = log_server_t(queue, *handlers)
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's not: "\n".join(lines)?
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
@@ -4,7 +4,7 @@ Contributor(s): Eric Debreuve (eric.debreuve@cnrs.fr) since 2023
4
4
  SEE COPYRIGHT NOTICE BELOW
5
5
  """
6
6
 
7
- __version__ = "2025.28"
7
+ __version__ = "2025.29"
8
8
 
9
9
  """
10
10
  COPYRIGHT NOTICE
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: logger-36
3
- Version: 2025.28
3
+ Version: 2025.29
4
4
  Summary: Simple logger with a catalog of handlers
5
5
  Home-page: https://src.koda.cnrs.fr/eric.debreuve/logger-36/
6
6
  Author: Eric Debreuve
@@ -1,5 +1,5 @@
1
1
  logger_36/__init__.py,sha256=mK6AD0eWI2Sk42oxleTvsxzYJ28FbHK5WNkpLgAhnNE,2129
2
- logger_36/version.py,sha256=M8fpBaTd8kBwBG4nMFWglaJivCiPj_h78PHrwTU20B0,1680
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=OTXM_Ltrn-5g-g09jDHfCROPLxA5D7Z9wX1XVe1rNkM,3215
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=069yBZKImTtbABgBHieJhKgkaqdak5Pr2Q7KXu3Caho,27820
48
+ logger_36/type/logger.py,sha256=xa30O5nehZ4NtSuaL2R5jeEInm_mwi6FhvNRMLVKRSU,28222
49
49
  logger_36/type/loggers.py,sha256=tFcuso9KGLDHnFfCaEJTDukUyYnbZEZrffpm59SDYO0,3067
50
- logger_36-2025.28.dist-info/METADATA,sha256=YyGRwdDyWtK2k3HRWOkvA_4Z1T4Yq4npNmHzFLP9Ru8,5980
51
- logger_36-2025.28.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
52
- logger_36-2025.28.dist-info/top_level.txt,sha256=sM95BTMWmslEEgR_1pzwZsOeSp8C_QBiu8ImbFr0XLc,10
53
- logger_36-2025.28.dist-info/RECORD,,
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,,