Skip to content

Commit 9dad7a8

Browse files
committed
feat: enhance logging functionality across examples and core modules
1 parent e88b9db commit 9dad7a8

File tree

6 files changed

+82
-36
lines changed

6 files changed

+82
-36
lines changed

docs/examples/cuboids_demagnetization.md

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,16 @@ import magpylib as magpy
3636
import numpy as np
3737
import pandas as pd
3838
import plotly.express as px
39-
from magpylib_material_response import get_dataset
39+
from magpylib_material_response import get_dataset, configure_logging
4040
from magpylib_material_response.demag import apply_demag
4141
from magpylib_material_response.meshing import mesh_all
42+
from magpylib_material_response.logging_config import get_logger
43+
44+
# Configure logging to see progress messages
45+
configure_logging()
46+
47+
# Initialize logger for contextualized logging
48+
logger = get_logger("magpylib_material_response.examples.cuboids_demagnetization")
4249
4350
if magpy.__version__.split(".")[0] != "5":
4451
raise RuntimeError(
@@ -89,15 +96,19 @@ coll_meshed.show()
8996
# apply demagnetization with varying number of cells
9097
colls = [coll]
9198
for target_elems in [1, 2, 8, 16, 32, 64, 128, 256]:
92-
with logger.contextualize(target_elems=target_elems):
93-
coll_meshed = mesh_all(
94-
coll, target_elems=target_elems, per_child_elems=True, min_elems=1
95-
)
96-
coll_demag = apply_demag(
97-
coll_meshed,
98-
style={"label": f"Coll_demag ({len(coll_meshed.sources_all):3d} cells)"},
99-
)
100-
colls.append(coll_demag)
99+
logger.info("🔄 Processing demagnetization with {target_elems} target elements", target_elems=target_elems)
100+
101+
coll_meshed = mesh_all(
102+
coll, target_elems=target_elems, per_child_elems=True, min_elems=1
103+
)
104+
105+
coll_demag = apply_demag(
106+
coll_meshed,
107+
style={"label": f"Coll_demag ({len(coll_meshed.sources_all):3d} cells)"},
108+
)
109+
colls.append(coll_demag)
110+
111+
logger.info("✅ Completed demagnetization: {actual_cells} cells created", actual_cells=len(coll_meshed.sources_all))
101112
```
102113

103114
## Compare with FEM analysis

docs/examples/soft_magnets.md

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,16 @@ import magpylib as magpy
3535
import numpy as np
3636
import pandas as pd
3737
import plotly.express as px
38+
from magpylib_material_response import configure_logging
3839
from magpylib_material_response.demag import apply_demag
3940
from magpylib_material_response.meshing import mesh_all
41+
from magpylib_material_response.logging_config import get_logger
42+
43+
# Configure logging to see progress messages
44+
configure_logging()
45+
46+
# Initialize logger for contextualized logging
47+
logger = get_logger("magpylib_material_response.examples.soft_magnets")
4048
4149
magpy.defaults.display.backend = "plotly"
4250
@@ -83,15 +91,19 @@ magpy.show(*coll_meshed)
8391
# apply demagnetization with varying number of cells
8492
colls = [coll]
8593
for target_elems in [1, 2, 8, 16, 32, 64, 128, 256]:
86-
with logger.contextualize(target_elems=target_elems):
87-
coll_meshed = mesh_all(
88-
coll, target_elems=target_elems, per_child_elems=True, min_elems=1
89-
)
90-
coll_demag = apply_demag(
91-
coll_meshed,
92-
style={"label": f"Coll_demag ({len(coll_meshed.sources_all):3d} cells)"},
93-
)
94-
colls.append(coll_demag)
94+
logger.info("🔄 Processing demagnetization with {target_elems} target elements", target_elems=target_elems)
95+
96+
coll_meshed = mesh_all(
97+
coll, target_elems=target_elems, per_child_elems=True, min_elems=1
98+
)
99+
100+
coll_demag = apply_demag(
101+
coll_meshed,
102+
style={"label": f"Coll_demag ({len(coll_meshed.sources_all):3d} cells)"},
103+
)
104+
colls.append(coll_demag)
105+
106+
logger.info("✅ Completed demagnetization: {actual_cells} cells created", actual_cells=len(coll_meshed.sources_all))
95107
```
96108

97109
+++ {"user_expressions": []}

src/magpylib_material_response/demag.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -395,20 +395,23 @@ def apply_demag(
395395
if not isinstance(src, BaseMagnet | BaseCurrent | magpy.Sensor)
396396
]
397397
if others_list:
398+
counts_others = Counter(s.__class__.__name__ for s in others_list)
399+
counts_str = ", ".join(f"{count} {name}" for name, count in counts_others.items())
398400
msg = (
399401
"Only Magnet and Current sources supported. "
400-
"Incompatible objects found: "
401-
f"{Counter(s.__class__.__name__ for s in others_list)}"
402+
f"Incompatible objects found: {counts_str}"
402403
)
403404
raise TypeError(msg)
404405
n = len(magnets_list)
405406
counts = Counter(s.__class__.__name__ for s in magnets_list)
406407
inplace_str = f"""{" (inplace)" if inplace else ""}"""
407408
lbl = collection.style.label
408409
coll_str = lbl if lbl else str(collection)
410+
# Create a clean message without problematic formatting characters
411+
counts_str = ", ".join(f"{count} {name}" for name, count in counts.items())
409412
demag_msg = (
410413
f"Demagnetization{inplace_str} of <blue>{coll_str}</blue>"
411-
f" with {n} cells - {counts}"
414+
f" with {n} cells ({counts_str})"
412415
)
413416
with timelog(demag_msg, min_log_time=min_log_time):
414417
# set up mr

src/magpylib_material_response/logging_config.py

Lines changed: 26 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -83,16 +83,32 @@ def configure_logging(
8383
)
8484

8585
if sink is None:
86-
sink = sys.stderr
87-
88-
# Build format string
89-
time_part = "<green>{time:YYYY-MM-DD HH:mm:ss}</green> | " if show_time else ""
90-
format_str = (
91-
f"{time_part}"
92-
"<level>{level:^8}</level> | "
93-
"<cyan>{extra[module]}</cyan> | "
94-
"{level.icon:<2} {message}"
95-
)
86+
sink = sys.stdout
87+
88+
# Custom format function to display structured data cleanly
89+
def format_record(record):
90+
time_part = f"<green>{record['time'].strftime('%Y-%m-%d %H:%M:%S')}</green> | " if show_time else ""
91+
92+
# Base format
93+
base = (
94+
f"{time_part}"
95+
f"<level>{record['level'].name:^8}</level> | "
96+
f"<cyan>{record['extra'].get('module', 'unknown')}</cyan> | "
97+
f"{record['level'].icon:<2} {record['message']}"
98+
)
99+
100+
# Add extra context (excluding 'module' since it's already shown)
101+
extra_items = []
102+
for key, value in record['extra'].items():
103+
if key != 'module':
104+
extra_items.append(f"<dim>{key}={value}</dim>")
105+
106+
if extra_items:
107+
base += " | " + " | ".join(extra_items)
108+
109+
return base + "\n"
110+
111+
format_str = format_record
96112

97113
# Configure the logger
98114
logger.add(

src/magpylib_material_response/meshing.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -429,9 +429,11 @@ def mesh_all(
429429
else:
430430
target_elems_by_child = [max(min_elems, target_elems)] * len(supported_objs)
431431
if incompatible_objs:
432+
counts_incompatible = Counter(s.__class__.__name__ for s in incompatible_objs)
433+
counts_str = ", ".join(f"{count} {name}" for name, count in counts_incompatible.items())
432434
msg = (
433435
"Incompatible objects found: "
434-
f"{Counter(s.__class__.__name__ for s in incompatible_objs)}"
436+
f"{counts_str}"
435437
f"\nSupported: {[s.__name__ for s in supported]}."
436438
)
437439
raise TypeError(msg)

src/magpylib_material_response/utils.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ def run(self):
4242
and time.time() - self.thread_start > self.min_log_time
4343
and not self._msg_displayed
4444
):
45-
logger.info("Starting operation", operation=self.msg)
45+
logger.info("🔄 Starting: {operation}", operation=self.msg)
4646
self._msg_displayed = True
4747
# include a delay here so the thread doesn't uselessly thrash the CPU
4848
time.sleep(max(0.01, self.min_log_time / 5))
@@ -62,11 +62,13 @@ def timelog(msg, min_log_time=1):
6262
thread_timer.stop()
6363
thread_timer.join()
6464
if end is None:
65-
logger.exception("Operation failed", operation=msg)
65+
logger.exception("❌ Failed: {operation}", operation=msg)
6666

6767
if end > min_log_time:
6868
logger.info(
69-
"Operation completed", operation=msg, duration_seconds=round(end, 3)
69+
"✅ Completed: {operation} in {duration}s",
70+
operation=msg,
71+
duration=round(end, 3)
7072
)
7173

7274

0 commit comments

Comments
 (0)