@@ -75,7 +75,6 @@ def emit(self, record: logging.LogRecord) -> None:
75
75
)
76
76
message = record .getMessage ()
77
77
78
- # --- 核心渲染逻辑在这里 ---
79
78
log_renderable = self .render (
80
79
record = record ,
81
80
message = message ,
@@ -110,23 +109,41 @@ def render(
110
109
# 使用 rich 的内置日志样式
111
110
path_text = Text (path , style = "log.path" , justify = "right" )
112
111
113
- log_table = Table .grid (expand = True , padding = (0 , 1 ))
114
- log_table .add_column (style = "log.time" )
115
- log_table .add_column (width = 6 )
116
- log_table .add_column (ratio = 1 )
117
- log_table .add_column (style = "log.path" )
112
+ single_line_table = Table .grid (expand = True , padding = (0 , 1 ))
113
+ single_line_table .add_column (style = "log.time" )
114
+ single_line_table .add_column (width = 6 )
115
+ single_line_table .add_column (ratio = 1 )
116
+ single_line_table .add_column (style = "log.path" )
117
+ single_line_table .add_row (time_text , level_text , message_text , path_text )
118
+
119
+ capture_console = Console (width = self .console .width , record = True )
120
+ with capture_console .capture () as capture :
121
+ capture_console .print (single_line_table )
122
+
123
+ # 3. 分析捕获到的字符串,判断行数
124
+ # .strip() 是为了去掉可能的尾部换行符
125
+ rendered_text = capture .get ().strip ()
126
+ is_multiline = "\n " in rendered_text
127
+
128
+ if not is_multiline :
129
+ # 如果没有换行符,说明单行搞定
130
+ final_layout = single_line_table
131
+ else :
132
+ # 否则,切换到健壮的两行布局
133
+ meta_table = Table .grid (expand = True , padding = (0 , 1 ))
134
+ meta_table .add_column (style = "log.time" )
135
+ meta_table .add_column (width = 6 )
136
+ meta_table .add_column (ratio = 1 )
137
+ meta_table .add_column (style = "log.path" )
138
+ meta_table .add_row (time_text , level_text , Text (r"↩" ), path_text )
118
139
119
- log_table .add_row (
120
- time_text ,
121
- level_text ,
122
- message_text ,
123
- path_text
124
- )
140
+ final_layout = Group (meta_table , message_text )
125
141
142
+ # --- 组合最终布局和 Traceback ---
126
143
if traceback :
127
- return Group (log_table , traceback )
144
+ return Group (final_layout , traceback )
128
145
else :
129
- return log_table
146
+ return final_layout
130
147
131
148
132
149
def init (logs_path : str = None , logger_level : int = logging .INFO ):
0 commit comments