返回提交历史
Modified
XFEExtension.NetCore.XFEConsole/XFEConsole.cs
+45
-51
Modified
XFEExtension.NetCore.XFEConsole/XFEConsoleClientInfo.cs
+3
-3
Modified
XFEExtension.NetCore.XFEConsole/XFEConsoleProgramClient.cs
+7
-9
Modified
XFEExtension.NetCore.XFEConsole/XFEConsoleTerminalServer.cs
+8
-18
Modified
XFEExtension.NetCore.XFEConsole/XFEConsoleTextWriter.cs
+22
-25
Modified
XFEExtension.NetCore.XFEConsole/XFEExtension.NetCore.XFEConsole.csproj
+11
-2
Modified
XFEExtension.NetCore.XFEConsole/XFEFileLog.cs
+1
-4
Modified
XFEExtension.NetCore.XFEConsole/XFELog.cs
+18
-23
Modified
XFEExtension.NetCore.XFEConsole/XFELogEntry.cs
+15
-25
XFEstudio/XFEExtension.NetCore.XFEConsole
XFEConsole 2.0:重构优化,提升性能与本地化
本次重大更新重构了 XFEConsole 及相关类库,统一并优化了日志、控制台和客户端输出逻辑,提升了代码健壮性和性能。 - 版本号升级至 2.0.0,依赖包锁定为 4.0.3 - 日志与输出方法重构,支持异步与本地化格式 - 属性、参数命名规范化(如 ClientUUID → ClientUuid) - 日志处理与文本转义逻辑简化,提升可读性 - 代码风格统一,去除冗余,便于维护扩展
8feb18f
代码差异
9 个文件
+130
-160
@@ -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);
@@ -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>
@@ -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
@@ -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
}
@@ -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]);
@@ -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>
@@ -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
@@ -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;
@@ -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
}