XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet
公开
关注 0 Fork 0 Star 0
返回提交历史

XFEstudio/XFEExtension.NetCore.XFEConsole

XFEConsole 2.0:重构优化,提升性能与本地化

本次重大更新重构了 XFEConsole 及相关类库,统一并优化了日志、控制台和客户端输出逻辑,提升了代码健壮性和性能。 - 版本号升级至 2.0.0,依赖包锁定为 4.0.3 - 日志与输出方法重构,支持异步与本地化格式 - 属性、参数命名规范化(如 ClientUUID → ClientUuid) - 日志处理与文本转义逻辑简化,提升可读性 - 代码风格统一,去除冗余,便于维护扩展

8feb18f
XFE工作室室长 <mail@xfegzs.com>
提交于

代码差异

9 个文件 +130 -160
Modified XFEExtension.NetCore.XFEConsole/XFEConsole.cs +45 -51
@@ -1,6 +1,6 @@
1 1 using System.Diagnostics;
2 using XFEExtension.NetCore.XFETransform.ObjectInfoAnalyzer;
3 2 using XFEExtension.NetCore.XFETransform;
3 using XFEExtension.NetCore.XFETransform.ObjectInfoAnalyzer;
4 4 using XFEExtension.NetCore.XFETransform.StringConverter;
5 5
6 6 namespace XFEExtension.NetCore.XFEConsole;
@@ -41,7 +41,7 @@ public static class XFEConsole
41 41 /// <summary>
42 42 /// 是否启动日志记录
43 43 /// </summary>
44 public static bool EnableLog { get; set; } = false;
44 public static bool EnableLog { get; set; }
45 45 /// <summary>
46 46 /// 当前日志
47 47 /// </summary>
@@ -140,7 +140,7 @@ public static class XFEConsole
140 140 string? objectInfo;
141 141 try
142 142 {
143 objectInfo = $"[foldblock color: white #9898e7 title: 分析对象:{obj?.GetType().Name} text: {XFEConverter.GetObjectInfo(StringConverter.ColoredObjectAnalyzer, remarkName, ObjectPlace.Main, 0, [obj], obj?.GetType(), obj, onlyProperty, onlyPublic).OutPutObject()}]";
143 objectInfo = obj is null ? $"[foldblock color: white #9898e7 title: 分析对象:{obj?.GetType().Name ?? "空对象"} text: 对象内容为空]" : $"[foldblock color: white #9898e7 title: 分析对象:{obj.GetType().Name} text: {XFEConverter.GetObjectInfo(StringConverter.ColoredObjectAnalyzer, remarkName, ObjectPlace.Main, 0, [obj], obj.GetType(), obj, onlyProperty, onlyPublic).OutPutObject()}]";
144 144 }
145 145 catch (Exception ex)
146 146 {
@@ -149,7 +149,7 @@ public static class XFEConsole
149 149 if (ShowInDebug)
150 150 Debug.WriteLine(objectInfo);
151 151 if (ShowInLocalConsole)
152 CurrentConsoleTextWriter?.OriginalTextWriter.WriteLine(objectInfo);
152 await (CurrentConsoleTextWriter?.OriginalTextWriter.WriteLineAsync(objectInfo) ?? Task.CompletedTask);
153 153 foreach (var client in ClientList)
154 154 await client.OutputMessage(objectInfo, true);
155 155 }
@@ -160,23 +160,21 @@ public static class XFEConsole
160 160 /// <returns></returns>
161 161 public static void WriteLine(string? text)
162 162 {
163 if (text is not null)
163 if (text is null) return;
164 if (ShowInDebug)
165 Debug.WriteLine(text);
166 if (EnableLog)
164 167 {
165 if (ShowInDebug)
166 Debug.WriteLine(text);
167 if (EnableLog)
168 {
169 var log = Log.WriteLine(text, out _);
170 if (ShowInLocalConsole)
171 CurrentConsoleTextWriter?.OriginalTextWriter.WriteLine(log.ToString());
172 }
173 else if (ShowInLocalConsole)
174 {
175 CurrentConsoleTextWriter?.OriginalTextWriter.WriteLine(text);
176 }
177 foreach (var client in ClientList)
178 client.OutputMessage($"[color {ConvertConsoleColorToString(Console.ForegroundColor)} {ConvertConsoleColorToString(Console.BackgroundColor)}]{text}", true).Wait();
168 var log = Log.WriteLine(text, out _);
169 if (ShowInLocalConsole)
170 CurrentConsoleTextWriter?.OriginalTextWriter.WriteLine(log.ToString());
171 }
172 else if (ShowInLocalConsole)
173 {
174 CurrentConsoleTextWriter?.OriginalTextWriter.WriteLine(text);
179 175 }
176 foreach (var client in ClientList)
177 client.OutputMessage($"[color {ConvertConsoleColorToString(Console.ForegroundColor)} {ConvertConsoleColorToString(Console.BackgroundColor)}]{text}", true).Wait();
180 178 }
181 179 /// <summary>
182 180 /// 向已连接的XFE控制台输出一条消息
@@ -185,23 +183,21 @@ public static class XFEConsole
185 183 /// <returns></returns>
186 184 public static void Write(string? text)
187 185 {
188 if (text is not null)
186 if (text is null) return;
187 if (ShowInDebug)
188 Debug.WriteLine(text);
189 if (EnableLog)
189 190 {
190 if (ShowInDebug)
191 Debug.WriteLine(text);
192 if (EnableLog)
193 {
194 var log = Log.Write(text, out var isHead);
195 if (ShowInLocalConsole && !Log.RecordOnlyOnWriteLine)
196 CurrentConsoleTextWriter?.OriginalTextWriter.Write($"{(Log.AutoAddTimeInfo && isHead ? XFELogEntry.TimeToString(log.Time) : string.Empty)}{text}");
197 }
198 else if (ShowInLocalConsole)
199 {
200 CurrentConsoleTextWriter?.OriginalTextWriter.Write(text);
201 }
202 foreach (var client in ClientList)
203 client.OutputMessage($"[color {ConvertConsoleColorToString(Console.ForegroundColor)} {ConvertConsoleColorToString(Console.BackgroundColor)}]{text}", false).Wait();
191 var log = Log.Write(text, out var isHead);
192 if (ShowInLocalConsole && !Log.RecordOnlyOnWriteLine)
193 CurrentConsoleTextWriter?.OriginalTextWriter.Write($"{(Log.AutoAddTimeInfo && isHead ? XFELogEntry.TimeToString(log.Time) : string.Empty)}{text}");
204 194 }
195 else if (ShowInLocalConsole)
196 {
197 CurrentConsoleTextWriter?.OriginalTextWriter.Write(text);
198 }
199 foreach (var client in ClientList)
200 client.OutputMessage($"[color {ConvertConsoleColorToString(Console.ForegroundColor)} {ConvertConsoleColorToString(Console.BackgroundColor)}]{text}", false).Wait();
205 201 }
206 202 /// <summary>
207 203 /// 向已连接的XFE控制台输出一条消息
@@ -210,23 +206,21 @@ public static class XFEConsole
210 206 /// <returns></returns>
211 207 public static async Task WriteLineAsync(string? text)
212 208 {
213 if (text is not null)
209 if (text is null) return;
210 if (ShowInDebug)
211 Debug.WriteLine(text);
212 if (EnableLog)
214 213 {
215 if (ShowInDebug)
216 Debug.WriteLine(text);
217 if (EnableLog)
218 {
219 var log = Log.WriteLine(text, out var isHead);
220 if (ShowInLocalConsole)
221 CurrentConsoleTextWriter?.OriginalTextWriter.WriteLine($"{(Log.AutoAddTimeInfo && isHead ? XFELogEntry.TimeToString(log.Time) : string.Empty)}{text}");
222 }
223 else if (ShowInLocalConsole)
224 {
225 CurrentConsoleTextWriter?.OriginalTextWriter.WriteLine(text);
226 }
227 foreach (var client in ClientList)
228 await client.OutputMessage($"[color {ConvertConsoleColorToString(Console.ForegroundColor)} {ConvertConsoleColorToString(Console.BackgroundColor)}]{text}", true);
214 var log = Log.WriteLine(text, out var isHead);
215 if (ShowInLocalConsole)
216 await (CurrentConsoleTextWriter?.OriginalTextWriter.WriteLineAsync($"{(Log.AutoAddTimeInfo && isHead ? XFELogEntry.TimeToString(log.Time) : string.Empty)}{text}") ?? Task.CompletedTask);
229 217 }
218 else if (ShowInLocalConsole)
219 {
220 await (CurrentConsoleTextWriter?.OriginalTextWriter.WriteLineAsync(text) ?? Task.CompletedTask);
221 }
222 foreach (var client in ClientList)
223 await client.OutputMessage($"[color {ConvertConsoleColorToString(Console.ForegroundColor)} {ConvertConsoleColorToString(Console.BackgroundColor)}]{text}", true);
230 224 }
231 225 /// <summary>
232 226 /// 向已连接的XFE控制台输出一条消息
@@ -243,11 +237,11 @@ public static class XFEConsole
243 237 {
244 238 var log = Log.Write(text, out var isHead);
245 239 if (ShowInLocalConsole && !Log.RecordOnlyOnWriteLine)
246 CurrentConsoleTextWriter?.OriginalTextWriter.Write($"{(Log.AutoAddTimeInfo && isHead ? XFELogEntry.TimeToString(log.Time) : string.Empty)}{text}");
240 await (CurrentConsoleTextWriter?.OriginalTextWriter.WriteAsync($"{(Log.AutoAddTimeInfo && isHead ? XFELogEntry.TimeToString(log.Time) : string.Empty)}{text}") ?? Task.CompletedTask);
247 241 }
248 242 else if (ShowInLocalConsole)
249 243 {
250 CurrentConsoleTextWriter?.OriginalTextWriter.Write(text);
244 await (CurrentConsoleTextWriter?.OriginalTextWriter.WriteAsync(text) ?? Task.CompletedTask);
251 245 }
252 246 foreach (var client in ClientList)
253 247 await client.OutputMessage($"[color {ConvertConsoleColorToString(Console.ForegroundColor)} {ConvertConsoleColorToString(Console.BackgroundColor)}]{text}", false);
Modified XFEExtension.NetCore.XFEConsole/XFEConsoleClientInfo.cs +3 -3
@@ -6,10 +6,10 @@ namespace XFEExtension.NetCore.XFEConsole;
6 6 /// XFE控制台客户端信息
7 7 /// </summary>
8 8 /// <param name="clientName">客户端名称</param>
9 /// <param name="clientUUID">客户端唯一标识符</param>
9 /// <param name="clientUuid">客户端唯一标识符</param>
10 10 /// <param name="password">客户端连接时密码</param>
11 11 /// <param name="eventArgs">事件参数</param>
12 public class XFEConsoleClientInfo(string clientName, string clientUUID, string password, CyberCommServerEventArgs eventArgs)
12 public class XFEConsoleClientInfo(string clientName, string clientUuid, string password, CyberCommServerEventArgs eventArgs)
13 13 {
14 14 /// <summary>
15 15 /// 客户端名称
@@ -18,7 +18,7 @@ public class XFEConsoleClientInfo(string clientName, string clientUUID, string p
18 18 /// <summary>
19 19 /// 客户端唯一标识符
20 20 /// </summary>
21 public string ClientUUID { get; set; } = clientUUID;
21 public string ClientUuid { get; set; } = clientUuid;
22 22 /// <summary>
23 23 /// 客户端密码
24 24 /// </summary>
Modified XFEExtension.NetCore.XFEConsole/XFEConsoleProgramClient.cs +7 -9
@@ -21,7 +21,7 @@ public class XFEConsoleProgramClient(string ipAddress, string clientName, string
21 21 /// <summary>
22 22 /// 客户端
23 23 /// </summary>
24 public CyberCommClient Client { get; set; } = new CyberCommClient(ipAddress);
24 public CyberCommClient Client { get; set; } = new(ipAddress);
25 25 /// <summary>
26 26 /// 客户端名称
27 27 /// </summary>
@@ -42,29 +42,27 @@ public class XFEConsoleProgramClient(string ipAddress, string clientName, string
42 42 {
43 43 Client.Connected += Client_Connected;
44 44 Client.MessageReceived += Client_MessageReceived;
45 Client.ClientWebSocket!.Options.SetRequestHeader(nameof(ClientName), ClientName);
46 Client.ClientWebSocket!.Options.SetRequestHeader(nameof(Password), Password);
47 Client.ClientWebSocket!.Options.SetRequestHeader(nameof(ClientID), ClientID);
45 Client.ClientWebSocket.Options.SetRequestHeader(nameof(ClientName), ClientName);
46 Client.ClientWebSocket.Options.SetRequestHeader(nameof(Password), Password);
47 Client.ClientWebSocket.Options.SetRequestHeader(nameof(ClientID), ClientID);
48 48 _ = Client.StartCyberCommClient();
49 49 if (Client.IsConnected)
50 50 return true;
51 else
52 return await new XFEWaitTask<bool>(ref ConnectTrigger!);
51 return await new XFEWaitTask<bool>(ref ConnectTrigger!);
53 52 }
54 53
55 private void Client_MessageReceived(object? sender, CyberCommClientEventArgs e)
54 private static void Client_MessageReceived(object? sender, CyberCommClientEventArgs e)
56 55 {
57 56 switch (e.MessageType)
58 57 {
59 58 case BackMessageType.Text:
60 break;
61 59 case BackMessageType.Binary:
62 60 break;
63 61 case BackMessageType.Error:
64 62 Debug.WriteLine(e.Exception);
65 63 break;
66 64 default:
67 break;
65 throw new ArgumentOutOfRangeException();
68 66 }
69 67 }
70 68
Modified XFEExtension.NetCore.XFEConsole/XFEConsoleTerminalServer.cs +8 -18
@@ -50,10 +50,7 @@ public class XFEConsoleTerminalServer
50 50 public XFEConsoleTerminalServer(int port, bool localOnly = true, string password = "")
51 51 {
52 52 Password = password;
53 if (localOnly)
54 Server = new CyberCommServer($"http://localhost:{port}/");
55 else
56 Server = new CyberCommServer(port);
53 Server = localOnly ? new CyberCommServer($"http://localhost:{port}/") : new CyberCommServer(port);
57 54 Server.ServerStarted += Server_ServerStarted;
58 55 Server.ClientConnected += Server_ClientConnected;
59 56 Server.ConnectionClosed += Server_ConnectionClosed;
@@ -86,18 +83,13 @@ public class XFEConsoleTerminalServer
86 83 case BackMessageType.Error:
87 84 ErrorOccurred?.Invoke(ClientInfoDictionary[e.CurrentWebSocket], e.Exception!);
88 85 break;
89 default:
90 break;
91 86 }
92 87 }
93 88
94 89 private void Server_ConnectionClosed(object? sender, CyberCommServerEventArgs e)
95 90 {
96 if (ClientInfoDictionary.TryGetValue(e.CurrentWebSocket, out XFEConsoleClientInfo? clientInfo))
97 {
98 ClientInfoDictionary.Remove(e.CurrentWebSocket);
99 Disconnected?.Invoke(this, clientInfo);
100 }
91 if (!ClientInfoDictionary.Remove(e.CurrentWebSocket, out var clientInfo)) return;
92 Disconnected?.Invoke(this, clientInfo);
101 93 }
102 94
103 95 private async void Server_ClientConnected(object? sender, CyberCommServerEventArgs e)
@@ -108,13 +100,11 @@ public class XFEConsoleTerminalServer
108 100 {
109 101 var password = e.WSHeader["Password"]!;
110 102 var clientName = e.WSHeader["ClientName"]!;
111 var clientUUID = e.WSHeader["ClientID"]!;
112 if (password == Password)
113 {
114 var clientInfo = new XFEConsoleClientInfo(clientName, clientUUID, password, e);
115 ClientInfoDictionary.Add(e.CurrentWebSocket, clientInfo);
116 Connected?.Invoke(this, clientInfo);
117 }
103 var clientUuid = e.WSHeader["ClientID"]!;
104 if (password != Password) return;
105 var clientInfo = new XFEConsoleClientInfo(clientName, clientUuid, password, e);
106 ClientInfoDictionary.Add(e.CurrentWebSocket, clientInfo);
107 Connected?.Invoke(this, clientInfo);
118 108 return;
119 109 }
120 110 }
Modified XFEExtension.NetCore.XFEConsole/XFEConsoleTextWriter.cs +22 -25
@@ -1,4 +1,5 @@
1 using System.Text;
1 using System.Globalization;
2 using System.Text;
2 3
3 4 namespace XFEExtension.NetCore.XFEConsole;
4 5
@@ -30,21 +31,19 @@ public class XFEConsoleTextWriter(TextWriter originalTextWriter) : TextWriter
30 31 /// <inheritdoc/>
31 32 public override void Write(char[]? buffer)
32 33 {
33 if (buffer is not null)
34 if (buffer is null) return;
35 var stringBuilder = new StringBuilder();
36 foreach (var sigChar in buffer)
34 37 {
35 var stringBuilder = new StringBuilder();
36 foreach (var sigChar in buffer)
37 {
38 stringBuilder.Append(sigChar);
39 }
40 XFEConsole.Write(stringBuilder.ToString());
38 stringBuilder.Append(sigChar);
41 39 }
40 XFEConsole.Write(stringBuilder.ToString());
42 41 }
43 42
44 43 /// <inheritdoc/>
45 44 public override void Write(char[] buffer, int index, int count)
46 45 {
47 for (int i = index; i < count; i++)
46 for (var i = index; i < count; i++)
48 47 {
49 48 var stringBuilder = new StringBuilder();
50 49 stringBuilder.Append(buffer[i]);
@@ -55,13 +54,13 @@ public class XFEConsoleTextWriter(TextWriter originalTextWriter) : TextWriter
55 54 /// <inheritdoc/>
56 55 public override void Write(decimal value)
57 56 {
58 XFEConsole.Write(value.ToString());
57 XFEConsole.Write(value.ToString(CultureInfo.CurrentCulture));
59 58 }
60 59
61 60 /// <inheritdoc/>
62 61 public override void Write(double value)
63 62 {
64 XFEConsole.Write(value.ToString());
63 XFEConsole.Write(value.ToString(CultureInfo.CurrentCulture));
65 64 }
66 65
67 66 /// <inheritdoc/>
@@ -85,7 +84,7 @@ public class XFEConsoleTextWriter(TextWriter originalTextWriter) : TextWriter
85 84 /// <inheritdoc/>
86 85 public override void Write(float value)
87 86 {
88 XFEConsole.Write(value.ToString());
87 XFEConsole.Write(value.ToString(CultureInfo.CurrentCulture));
89 88 }
90 89
91 90 /// <inheritdoc/>
@@ -121,7 +120,7 @@ public class XFEConsoleTextWriter(TextWriter originalTextWriter) : TextWriter
121 120 /// <inheritdoc/>
122 121 public override async Task WriteAsync(char[] buffer, int index, int count)
123 122 {
124 for (int i = index; i < count; i++)
123 for (var i = index; i < count; i++)
125 124 {
126 125 var stringBuilder = new StringBuilder();
127 126 stringBuilder.Append(buffer[i]);
@@ -156,21 +155,19 @@ public class XFEConsoleTextWriter(TextWriter originalTextWriter) : TextWriter
156 155 /// <inheritdoc/>
157 156 public override void WriteLine(char[]? buffer)
158 157 {
159 if (buffer is not null)
158 if (buffer is null) return;
159 var stringBuilder = new StringBuilder();
160 foreach (var sigChar in buffer)
160 161 {
161 var stringBuilder = new StringBuilder();
162 foreach (var sigChar in buffer)
163 {
164 stringBuilder.Append(sigChar);
165 }
166 XFEConsole.WriteLine(stringBuilder.ToString());
162 stringBuilder.Append(sigChar);
167 163 }
164 XFEConsole.WriteLine(stringBuilder.ToString());
168 165 }
169 166
170 167 /// <inheritdoc/>
171 168 public override void WriteLine(char[] buffer, int index, int count)
172 169 {
173 for (int i = index; i < count; i++)
170 for (var i = index; i < count; i++)
174 171 {
175 172 var stringBuilder = new StringBuilder();
176 173 stringBuilder.Append(buffer[i]);
@@ -181,13 +178,13 @@ public class XFEConsoleTextWriter(TextWriter originalTextWriter) : TextWriter
181 178 /// <inheritdoc/>
182 179 public override void WriteLine(decimal value)
183 180 {
184 XFEConsole.WriteLine(value.ToString());
181 XFEConsole.WriteLine(value.ToString(CultureInfo.CurrentCulture));
185 182 }
186 183
187 184 /// <inheritdoc/>
188 185 public override void WriteLine(double value)
189 186 {
190 XFEConsole.WriteLine(value.ToString());
187 XFEConsole.WriteLine(value.ToString(CultureInfo.CurrentCulture));
191 188 }
192 189
193 190 /// <inheritdoc/>
@@ -216,7 +213,7 @@ public class XFEConsoleTextWriter(TextWriter originalTextWriter) : TextWriter
216 213 /// <inheritdoc/>
217 214 public override void WriteLine(float value)
218 215 {
219 XFEConsole.WriteLine(value.ToString());
216 XFEConsole.WriteLine(value.ToString(CultureInfo.CurrentCulture));
220 217 }
221 218
222 219 /// <inheritdoc/>
@@ -258,7 +255,7 @@ public class XFEConsoleTextWriter(TextWriter originalTextWriter) : TextWriter
258 255 /// <inheritdoc/>
259 256 public override async Task WriteLineAsync(char[] buffer, int index, int count)
260 257 {
261 for (int i = index; i < count; i++)
258 for (var i = index; i < count; i++)
262 259 {
263 260 var stringBuilder = new StringBuilder();
264 261 stringBuilder.Append(buffer[i]);
Modified XFEExtension.NetCore.XFEConsole/XFEExtension.NetCore.XFEConsole.csproj +11 -2
@@ -4,7 +4,7 @@
4 4 <TargetFramework>net10.0</TargetFramework>
5 5 <ImplicitUsings>enable</ImplicitUsings>
6 6 <Nullable>enable</Nullable>
7 <Version>1.2.3</Version>
7 <Version>2.0.0</Version>
8 8 <Authors>XFEstudio</Authors>
9 9 <Company>寰宇朽力网络科技</Company>
10 10 <Description>XFEConsole是一个可以运行用户进行远程输出的调试辅助工具,需要配合XFE工具箱来使用,当然也可以根据本DLL内的架构搭建一个调试工具</Description>
@@ -14,7 +14,16 @@
14 14 <PackageReadmeFile>README.md</PackageReadmeFile>
15 15 <RepositoryUrl>https://github.com/XFEstudio/XFEExtension.NetCore.XFEConsole.git</RepositoryUrl>
16 16 <PackageTags>XFE;Console;Test;Out;Output;Remote;</PackageTags>
17 <PackageReleaseNotes>修复一处已知问题</PackageReleaseNotes>
17 <PackageReleaseNotes>
18 XFEConsole 2.0:重构优化,提升性能与本地化
19
20 本次重大更新重构了 XFEConsole 及相关类库,统一并优化了日志、控制台和客户端输出逻辑,提升了代码健壮性和性能。
21 - 版本号升级至 2.0.0,依赖包为 4.0.*
22 - 日志与输出方法重构,支持异步与本地化格式
23 - 属性、参数命名规范化(如 ClientUUID → ClientUuid)
24 - 日志处理与文本转义逻辑简化,提升可读性
25 - 代码风格统一,去除冗余,便于维护扩展
26 </PackageReleaseNotes>
18 27 <PackageLicenseFile>LICENSE</PackageLicenseFile>
19 28 <GeneratePackageOnBuild>True</GeneratePackageOnBuild>
20 29 <Title>XFEExtension.NetCore.XFEConsole</Title>
Modified XFEExtension.NetCore.XFEConsole/XFEFileLog.cs +1 -4
@@ -16,10 +16,7 @@ public class XFEFileLog : XFELog
16 16 /// <inheritdoc/>
17 17 public override List<XFELogEntry> Logs
18 18 {
19 get
20 {
21 return ImportFromText(Export());
22 }
19 get => ImportFromText(Export());
23 20 protected set => base.Logs = value;
24 21 }
25 22
Modified XFEExtension.NetCore.XFEConsole/XFELog.cs +18 -23
@@ -184,7 +184,7 @@ public abstract class XFELog
184 184 logText = split[1];
185 185 if (split.Length > 2)
186 186 {
187 bool inverse = false;
187 var inverse = false;
188 188 for (var i = 2; i < split.Length; i++)
189 189 {
190 190 logText += $"{(inverse ? ']' : '[')}{split[i]}";
@@ -195,31 +195,26 @@ public abstract class XFELog
195 195 }
196 196 }
197 197 catch { }
198 if (RecordOnlyOnWriteLine)
198
199 if (!RecordOnlyOnWriteLine) return AddLog(logText, logLevel);
200 if (isHead)
199 201 {
200 if (isHead)
202 var log = new XFELogEntry
201 203 {
202 var log = new XFELogEntry
203 {
204 Time = DateTime.Now,
205 Level = logLevel,
206 LogText = logText
207 };
208 CacheLog.Value = null;
209 AddLog(log);
210 return log;
211 }
212 CacheLog.Value!.Level = logLevel;
213 CacheLog.Value!.LogText += logText;
214 var returnLog = CacheLog.Value;
204 Time = DateTime.Now,
205 Level = logLevel,
206 LogText = logText
207 };
215 208 CacheLog.Value = null;
216 AddLog(returnLog);
217 return returnLog;
218 }
219 else
220 {
221 return AddLog(logText, logLevel);
209 AddLog(log);
210 return log;
222 211 }
212 CacheLog.Value!.Level = logLevel;
213 CacheLog.Value!.LogText += logText;
214 var returnLog = CacheLog.Value;
215 CacheLog.Value = null;
216 AddLog(returnLog);
217 return returnLog;
223 218 }
224 219
225 220 /// <summary>
@@ -269,7 +264,7 @@ public abstract class XFELog
269 264 converters = [new("\n", "\\n", "n", "\\"), new("\r", "\\r", "r", "\\")];
270 265 foreach (var log in logText.Split('\n', StringSplitOptions.RemoveEmptyEntries))
271 266 {
272 if (log is not null && XFELogEntry.FromString(log, converters) is XFELogEntry xFELogEntry)
267 if (XFELogEntry.FromString(log, converters) is { } xFELogEntry)
273 268 logs.Add(xFELogEntry);
274 269 }
275 270 return logs;
Modified XFEExtension.NetCore.XFEConsole/XFELogEntry.cs +15 -25
@@ -28,13 +28,7 @@ public class XFELogEntry
28 28 /// 转为日志文本(含时间)
29 29 /// </summary>
30 30 /// <returns></returns>
31 public string ToString(params EscapeConverter[] converters)
32 {
33 var logText = LogText;
34 foreach (var converter in converters)
35 logText = converter.Convert(logText);
36 return $"{TimeToString(Time)}{LevelToString(Level)}{logText}";
37 }
31 public string ToString(params EscapeConverter[] converters) => $"{TimeToString(Time)}{LevelToString(Level)}{converters.Aggregate(LogText, (current, converter) => converter.Convert(current))}";
38 32
39 33 /// <summary>
40 34 /// 日期转字符串
@@ -83,27 +77,23 @@ public class XFELogEntry
83 77 public static XFELogEntry? FromString(string logString, params EscapeConverter[] converters)
84 78 {
85 79 var split = logString.Split(['[', ']'], StringSplitOptions.RemoveEmptyEntries);
86 if (split.Length > 2)
80 if (split.Length <= 2) return null;
81 var logText = split[2];
82 if (split.Length > 3)
87 83 {
88 var logText = split[2];
89 if (split.Length > 3)
84 var inverse = false;
85 for (var i = 3; i < split.Length; i++)
90 86 {
91 bool inverse = false;
92 for (var i = 3; i < split.Length; i++)
93 {
94 logText += $"{(inverse ? ']' : '[')}{split[i]}";
95 inverse = !inverse;
96 }
87 logText += $"{(inverse ? ']' : '[')}{split[i]}";
88 inverse = !inverse;
97 89 }
98 foreach (var converter in converters)
99 logText = converter.Inverse(logText);
100 return new()
101 {
102 Time = StringToTime(split[0]),
103 Level = StringToLevel(split[1]),
104 LogText = logText
105 };
106 90 }
107 return null;
91 logText = converters.Aggregate(logText, (current, converter) => converter.Inverse(current));
92 return new()
93 {
94 Time = StringToTime(split[0]),
95 Level = StringToLevel(split[1]),
96 LogText = logText
97 };
108 98 }
109 99 }