From fe851f6e3acaa81864d203529546eebbca635d07 Mon Sep 17 00:00:00 2001 From: DavdGao Date: Tue, 28 May 2024 21:25:09 +0800 Subject: [PATCH 1/3] wip --- src/agentscope/utils/logging_utils.py | 32 ++++++++++++++------------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/src/agentscope/utils/logging_utils.py b/src/agentscope/utils/logging_utils.py index e5de7b84f..b67fa5a67 100644 --- a/src/agentscope/utils/logging_utils.py +++ b/src/agentscope/utils/logging_utils.py @@ -28,13 +28,14 @@ LEVEL_CHAT_SAVE = "CHAT_SAVE" _SPEAKER_COLORS = [ - ("", ""), - ("", ""), - ("", ""), - ("", ""), - ("", ""), - ("", ""), - ("", ""), + ("\033[90m", "\033[0m"), + ("\033[91m", "\033[0m"), + ("\033[92m", "\033[0m"), + ("\033[93m", "\033[0m"), + ("\033[94m", "\033[0m"), + ("\033[95m", "\033[0m"), + ("\033[96m", "\033[0m"), + ("\033[97m", "\033[0m"), ] _SPEAKER_TO_COLORS = {} @@ -89,7 +90,7 @@ def _chat( *args, **kwargs, ) - + # Print message in terminal with specific format if isinstance(message, dict): contain_name_or_role = "name" in message or "role" in message @@ -104,23 +105,21 @@ def _chat( print_str = [] if contain_content: print_str.append( - f"{m1}{speaker}{m2}: {message['content']}", + f"{m1}\033[1m{speaker}\033[0m{m2}: {message['content']}", ) if contain_url: - print_str.append(f"{m1}{speaker}{m2}: {message['url']}") + print_str.append(f"{m1}\033[1m{speaker}\033[0m{m2}: {message['url']}") if len(print_str) > 0: - print_str = ( - "\n".join(print_str).replace("{", "{{").replace("}", "}}") - ) + print_str = "\n".join(print_str) + logger.log(LEVEL_CHAT_LOG, print_str, *args, **kwargs) if hasattr(thread_local_data, "uid") and not disable_studio: log_studio(message, thread_local_data.uid, **kwargs) return - message = str(message).replace("{", "{{").replace("}", "}}") logger.log(LEVEL_CHAT_LOG, message, *args, **kwargs) @@ -183,7 +182,8 @@ def log_studio(message: dict, uid: str, **kwargs: Any) -> None: def _level_format(record: dict) -> str: """Format the log record.""" if record["level"].name == LEVEL_CHAT_LOG: - return record["message"] + "\n" + # return "{message}" + return "{message}\n" else: return ( "{time:YYYY-MM-DD HH:mm:ss.SSS} | {" @@ -211,6 +211,8 @@ def setup_logger( if not hasattr(logger, "chat"): # add chat function for logger logger.level(LEVEL_CHAT_LOG, no=21) + + # save chat message into file logger.level(LEVEL_CHAT_SAVE, no=0) logger.chat = _chat From 3325b9ad7e96c0f37b6ee922b4e9ae4ca47a5262 Mon Sep 17 00:00:00 2001 From: DavdGao Date: Wed, 29 May 2024 10:21:44 +0800 Subject: [PATCH 2/3] fix bug in logger; reformat --- src/agentscope/utils/logging_utils.py | 55 +++++++++++++++++++-------- 1 file changed, 39 insertions(+), 16 deletions(-) diff --git a/src/agentscope/utils/logging_utils.py b/src/agentscope/utils/logging_utils.py index b67fa5a67..9d7fcf711 100644 --- a/src/agentscope/utils/logging_utils.py +++ b/src/agentscope/utils/logging_utils.py @@ -24,8 +24,9 @@ "CRITICAL", ] -LEVEL_CHAT_LOG = "CHAT_LOG" -LEVEL_CHAT_SAVE = "CHAT_SAVE" +LEVEL_SAVE_LOG = "SAVE_LOG" +LEVEL_SAVE_MSG = "SAVE_MSG" +LEVEL_DISPLAY_MSG = "DISPLAY_MSG" _SPEAKER_COLORS = [ ("\033[90m", "\033[0m"), @@ -83,14 +84,15 @@ def _chat( "content" keys, and the message will be logged as ": ". """ - # Save message into file, add default to ignore not serializable objects + # Save message into chat file, add default to ignore not serializable + # objects logger.log( - LEVEL_CHAT_SAVE, + LEVEL_SAVE_MSG, json.dumps(message, ensure_ascii=False, default=lambda _: None), *args, **kwargs, ) - + # Print message in terminal with specific format if isinstance(message, dict): contain_name_or_role = "name" in message or "role" in message @@ -103,24 +105,43 @@ def _chat( (m1, m2) = _get_speaker_color(speaker) print_str = [] + print_str_without_markers = [] if contain_content: print_str.append( f"{m1}\033[1m{speaker}\033[0m{m2}: {message['content']}", ) + print_str_without_markers.append( + f"{speaker}: {message['content']}", + ) if contain_url: - print_str.append(f"{m1}\033[1m{speaker}\033[0m{m2}: {message['url']}") + print_str.append( + f"{m1}\033[1m{speaker}\033[0m{m2}: {message['url']}", + ) + print_str_without_markers.append( + f"{speaker}: {message['url']}", + ) if len(print_str) > 0: print_str = "\n".join(print_str) + print_str_without_markers = "\n".join( + print_str_without_markers, + ) - logger.log(LEVEL_CHAT_LOG, print_str, *args, **kwargs) + logger.log(LEVEL_DISPLAY_MSG, print_str, *args, **kwargs) + logger.log( + LEVEL_SAVE_LOG, + print_str_without_markers, + *args, + **kwargs, + ) if hasattr(thread_local_data, "uid") and not disable_studio: log_studio(message, thread_local_data.uid, **kwargs) return - logger.log(LEVEL_CHAT_LOG, message, *args, **kwargs) + logger.log(LEVEL_DISPLAY_MSG, message, *args, **kwargs) + logger.log(LEVEL_SAVE_LOG, message, *args, **kwargs) def log_studio(message: dict, uid: str, **kwargs: Any) -> None: @@ -181,8 +202,8 @@ def log_studio(message: dict, uid: str, **kwargs: Any) -> None: def _level_format(record: dict) -> str: """Format the log record.""" - if record["level"].name == LEVEL_CHAT_LOG: - # return "{message}" + # Display the chat message + if record["level"].name in [LEVEL_DISPLAY_MSG, LEVEL_SAVE_LOG]: return "{message}\n" else: return ( @@ -210,10 +231,11 @@ def setup_logger( # avoid reinit in subprocess if not hasattr(logger, "chat"): # add chat function for logger - logger.level(LEVEL_CHAT_LOG, no=21) + logger.level(LEVEL_SAVE_LOG, no=51) + logger.level(LEVEL_DISPLAY_MSG, no=52) # save chat message into file - logger.level(LEVEL_CHAT_SAVE, no=0) + logger.level(LEVEL_SAVE_MSG, no=53) logger.chat = _chat # set logging level @@ -221,7 +243,8 @@ def setup_logger( # standard output for all logging except chat logger.add( sys.stdout, - filter=lambda record: record["level"].name != LEVEL_CHAT_SAVE, + filter=lambda record: record["level"].name + not in [LEVEL_SAVE_LOG, LEVEL_SAVE_MSG], format=_level_format, enqueue=True, level=level, @@ -238,7 +261,8 @@ def setup_logger( # save all logging into file logger.add( path_log_file, - filter=lambda record: record["level"].name != LEVEL_CHAT_SAVE, + filter=lambda record: record["level"].name + not in [LEVEL_SAVE_MSG, LEVEL_DISPLAY_MSG], format=_level_format, enqueue=True, level=level, @@ -246,8 +270,7 @@ def setup_logger( logger.add( path_chat_file, - filter=lambda record: record["level"].name == LEVEL_CHAT_SAVE, format="{message}", enqueue=True, - level=LEVEL_CHAT_SAVE, + level=LEVEL_SAVE_MSG, ) From 352011bd2d7325f3f598e1186a9a59dae2efffaf Mon Sep 17 00:00:00 2001 From: DavdGao Date: Wed, 29 May 2024 15:07:57 +0800 Subject: [PATCH 3/3] Add test example in logger_test.py --- tests/logger_test.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/tests/logger_test.py b/tests/logger_test.py index b786b6c99..97fecb5a9 100644 --- a/tests/logger_test.py +++ b/tests/logger_test.py @@ -42,6 +42,9 @@ def test_logger_chat(self) -> None: # dict logger.chat({"abc": 1}) + # html labels + logger.chat({"name": "Bob", "content": "
abc None: '"}\n', '{"name": "Alice", "url": "https://xxx.png"}\n', '{"abc": 1}\n', + '{"name": "Bob", "content": "
abc None: """Tear down for LoggerTest.""" - logger.stop() + logger.remove() if os.path.exists(self.run_dir): shutil.rmtree(self.run_dir)