Skip to content

Commit 5db89e2

Browse files
committed
5. add nofmt extra field support to morebuiltins.cmd.log_server to skip formatting for high-frequency/thinking logs.
1 parent 6cc6cfe commit 5db89e2

File tree

2 files changed

+56
-12
lines changed

2 files changed

+56
-12
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
1. Use `sys.stdout = LoggerStream()` to redirect all stdout to LoggerStream, which sends logs to the logging system / file / custom writer.
99
2. `LoggerStream.replace_print_ctx`: A context manager to temporarily replace the print function within a block of code.
1010
1. add time prefix to each print line.
11+
5. add `nofmt` extra field support to `morebuiltins.cmd.log_server` to skip formatting for high-frequency/thinking logs.
1112

1213
### 1.3.4 (2025-10-15)
1314
1. fix `morebuiltins.utils.gen_id` wrong length issue.

morebuiltins/cmd/log_server.py

Lines changed: 55 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -514,6 +514,27 @@ def get_setting(self, name: str):
514514
self._log_settings[name] = default
515515
return default
516516

517+
def make_record(
518+
self,
519+
name,
520+
level,
521+
fn,
522+
lno,
523+
msg,
524+
args,
525+
exc_info,
526+
func=None,
527+
extra=None,
528+
sinfo=None,
529+
) -> logging.LogRecord:
530+
rv = logging.LogRecord(name, level, fn, lno, msg, args, exc_info, func, sinfo)
531+
if extra is not None:
532+
for key in extra:
533+
if key in rv.__dict__:
534+
continue
535+
rv.__dict__[key] = extra[key]
536+
return rv
537+
517538
def write_queue_consumer(self):
518539
self.send_log("start write_queue_consumer daemon")
519540
stopped = False
@@ -541,20 +562,29 @@ def write_queue_consumer(self):
541562
self.send_log("stopping write_worker daemon(signal)")
542563
stopped = True
543564
continue
544-
name, record = q_msg.name, q_msg.record
565+
name, record_dict = q_msg.name, q_msg.record
566+
if self.save_setting(name, record_dict):
567+
# ignore msg only for setting
568+
continue
545569
try:
546-
log_record = logging.LogRecord(
547-
level=record.get("levelno", 0), **record
570+
log_record = self.make_record(
571+
name=name,
572+
level=record_dict.get("levelno", logging.INFO),
573+
fn=record_dict.get("pathname", ""),
574+
lno=record_dict.get("lineno", 0),
575+
msg=record_dict.get("msg", ""),
576+
args=record_dict.get("args", ()),
577+
exc_info=record_dict.get("exc_info", None),
578+
func=record_dict.get("funcName", None),
579+
extra=record_dict,
580+
sinfo=record_dict.get("stack_info", None),
548581
)
549582
except Exception as e:
550583
self.send_log(
551-
f"`{name}` send invalid record.__dict__, {e!r}: {repr(record)[:100]}",
584+
f"`{name}` send invalid record.__dict__, {e!r}: {repr(record_dict)[:100]}",
552585
level=logging.WARNING,
553586
)
554587
continue
555-
if self.save_setting(name, record):
556-
# ignore msg only for setting
557-
continue
558588
if name in new_lines:
559589
new_lines[name].append(log_record)
560590
else:
@@ -565,7 +595,13 @@ def write_queue_consumer(self):
565595
setting = self.get_setting(name)
566596
_format = setting.formatter.format
567597
lines = [
568-
(record.levelno, _format(record)) for record in record_list
598+
(
599+
record.levelno,
600+
record.msg
601+
if getattr(record, "nofmt", False)
602+
else _format(record),
603+
)
604+
for record in record_list
569605
]
570606
targets = self.get_targets(
571607
name,
@@ -902,20 +938,27 @@ async def async_test():
902938
for i in range(5):
903939
logger.info(f"log server test message {i + 1}")
904940
logger.error(f"log server test message {i + 1}")
905-
# shutil.rmtree("logs", ignore_errors=True)
941+
logger.info("test nofmt: ", extra={"nofmt": True})
942+
for i in range(5):
943+
logger.info(f"{i} ", extra={"nofmt": True})
944+
shutil.rmtree("logs", ignore_errors=True)
906945

907946

908947
def sync_test():
909-
# return asyncio.run(async_test())
948+
asyncio.run(async_test())
910949
with LogServer(log_dir="logs"):
911950
logger = get_logger("test_sync", level_specs=[logging.ERROR, 13])
912951
for i in range(5):
913952
logger.info(f"log server test message {i + 1}")
914-
# shutil.rmtree("logs", ignore_errors=True)
953+
logger.log(13, "log server test message level 13")
954+
logger.info("test nofmt: ", extra={"nofmt": True})
955+
for i in range(5):
956+
logger.info(f"{i} ", extra={"nofmt": True})
957+
shutil.rmtree("logs", ignore_errors=True)
915958

916959

917960
def entrypoint():
918-
return sync_test()
961+
# return sync_test()
919962
return asyncio.run(main())
920963

921964

0 commit comments

Comments
 (0)