返回提交历史
Modified
README.md
+34
-4
Modified
XFEExtension.NetCore.XFEConsole.Test/Program.cs
+29
-7
Added
XFEExtension.NetCore.XFEConsole/LogLevel.cs
+32
-0
Modified
XFEExtension.NetCore.XFEConsole/XFEConsole.cs
+46
-15
Modified
XFEExtension.NetCore.XFEConsole/XFEExtension.NetCore.XFEConsole.csproj
+3
-3
Added
XFEExtension.NetCore.XFEConsole/XFELog.cs
+242
-0
Added
XFEExtension.NetCore.XFEConsole/XFELogEntry.cs
+100
-0
XFEstudio/XFEExtension.NetCore.XFEConsole
完善日志记录功能
4ffce9d
代码差异
7 个文件
+486
-29
@@ -2,9 +2,11 @@
2
2
3
3
## 简述
4
4
5
XFEExtension.NetCore.XFEConsole是一个可以运行用户进行远程输出的调试辅助工具,需要配合XFE工具箱来使用,当然也可以根据本DLL内的架构搭建一个调试工具
5
XFEExtension.NetCore.XFEConsole是一个可以允许用户进行远程输出的调试辅助工具,需要配合XFE工具箱来使用,当然也可以根据本DLL内的架构搭建一个调试工具
6
6
7
## 使用方法
7
## 远程控制台
8
9
### 输出至远程控制台
8
10
9
11
```csharp
10
12
await XFEConsole.UseXFEConsole(3280); // 使用XFE控制台并连接端口为3280的控制台调试终端
@@ -12,11 +14,13 @@ await XFEConsole.UseXFEConsole(3280); // 使用XFE控制台并连接端口为3
12
14
13
15
XFEConsole.ShowInDebug = true; // 是否在本地调试的Debug中展示,默认为 true
14
16
XFEConsole.UseConsoleColor = true; // 使用控制台颜色,默认为 true
15
XFEConsole.ShowInLocalConsole = false; // 是否在本地控制台中显示,默认为 false
17
XFEConsole.ShowInLocalConsole = true; // 是否在本地控制台中显示,默认为 false
16
18
XFEConsole.AutoAnalyzeObject = true; // 是否自动解析对象,而非直接输出对象的.ToString()方法,默认为 true
19
20
Console.WriteLine("Hello World!"); // 这条语句会在远程控制台中输出Hello World!
17
21
```
18
22
19
## 配合XUnit测试框架
23
### 配合XUnit测试框架
20
24
21
25
```csharp
22
26
class Program
@@ -28,4 +32,30 @@ class Program
28
32
Console.WriteLine("使用XUnit框架输出");
29
33
}
30
34
}
35
```
36
37
---
38
39
## 日志
40
41
### 记录日志
42
```csharp
43
XFEConsole.UseXFEConsoleLog(); // 使用XFE日志记录每一次Console.Write或者WriteLine的内容
44
Console.WriteLine("Hello World!"); // 会直接在日志中记录Hello World!
45
46
Console.Write("Hello"); // 缓存直到下一个Console.WriteLine的出现
47
Console.WriteLine(" World!"); // 此时才会记录Hello World!
48
49
Console.WriteLine("[DEBUG]This is a debug message"); // 会记录级别为DEBUG的日志
50
Console.WriteLine("[INFO]This is a info"); // 会记录级别为INFO的日志
51
Console.WriteLine("[TRACE]Throw at Main() on line:24 position:25"); // 会记录级别为TRACE的日志
52
Console.WriteLine("[ERROR]Exception thrown"); // 会记录级别为ERROR的日志
53
Console.WriteLine("[FATAL]Application crashed... unknown reason"); // 会记录级别为FATAL的日志
54
```
55
56
### 导入导出日志
57
```csharp
58
var log = XFEConsole.Log.Export(); // 导出日志为文本
59
XFEConsole.Log.Clear() // 清除全部日志
60
XFEConsole.Log.Import(log); // 导入日志文本
31
61
```
@@ -1,6 +1,7 @@
1
1
using XFEExtension.NetCore.XFEConsole;
2
2
3
await XFEConsole.UseXFEConsole();
3
XFEConsole.ShowInDebug = false;
4
XFEConsole.UseXFEConsoleLog();
4
5
Console.WriteLine("准备测试...");
5
6
await Task.Delay(1000);
6
7
Console.WriteLine("3");
@@ -9,10 +10,31 @@ Console.WriteLine("2");
9
10
await Task.Delay(1000);
10
11
Console.WriteLine("1");
11
12
await Task.Delay(1000);
12
for (int i = 0; i < 10000; i++)
13
{
14
Console.WriteLine($"循环压力测试:{i}");
15
}
13
Console.WriteLine("测试输出");
14
Console.WriteLine("测试\n第二行\n第\\n三行\n最后一行");
16
15
await Task.Delay(1000);
17
Console.WriteLine("测试结束");
18
await Task.Delay(3000);
16
Console.Write("开始:");
17
await Task.Delay(1000);
18
Console.Write("1..");
19
await Task.Delay(1000);
20
Console.Write(" 2..");
21
await Task.Delay(1000);
22
Console.Write("[ERROR] 3");
23
Console.Write("测试\n第二行\n第\\n三行\n最后一行");
24
await Task.Delay(1000);
25
Console.WriteLine("结束");
26
//await Task.Delay(1000);
27
//Console.WriteLine("准备进行压力测试");
28
//await Task.Delay(3000);
29
//for (int i = 0; i < 10000; i++)
30
// Console.WriteLine($"[DEBUG]循环压力测试:{i}");
31
//await Task.Delay(1000);
32
//Console.WriteLine("测试结束");
33
await Task.Delay(3000);
34
Console.WriteLine("输出结果");
35
var exportText = XFELog.Current?.Export();
36
Console.WriteLine(exportText);
37
XFELog.Current?.Clear();
38
if (exportText is not null)
39
XFELog.Current?.Import(exportText);
40
Console.WriteLine("完成");
@@ -0,0 +1,32 @@
1
namespace XFEExtension.NetCore.XFEConsole;
2
3
/// <summary>
4
/// 日志等级
5
/// </summary>
6
public enum LogLevel
7
{
8
/// <summary>
9
/// 跟踪
10
/// </summary>
11
Trace,
12
/// <summary>
13
/// 调试
14
/// </summary>
15
Debug,
16
/// <summary>
17
/// 信息
18
/// </summary>
19
Info,
20
/// <summary>
21
/// 警告
22
/// </summary>
23
Warning,
24
/// <summary>
25
/// 错误
26
/// </summary>
27
Error,
28
/// <summary>
29
/// 致命错误
30
/// </summary>
31
Fatal
32
}
@@ -8,12 +8,8 @@ namespace XFEExtension.NetCore.XFEConsole;
8
8
/// <summary>
9
9
/// XFE控制台
10
10
/// </summary>
11
public class XFEConsole
11
public static class XFEConsole
12
12
{
13
/// <summary>
14
/// 当前控制台输出流
15
/// </summary>
16
public static XFEConsoleTextWriter? CurrentConsoleTextWriter { get; set; }
17
13
/// <summary>
18
14
/// 是否在本地调试的Debug中展示
19
15
/// </summary>
@@ -34,7 +30,7 @@ public class XFEConsole
34
30
/// <remarks>
35
31
/// 默认为 false
36
32
/// </remarks>
37
public static bool ShowInLocalConsole { get; set; } = false;
33
public static bool ShowInLocalConsole { get; set; } = true;
38
34
/// <summary>
39
35
/// 是否自动解析对象,而非直接输出对象的.ToString()方法
40
36
/// </summary>
@@ -43,10 +39,22 @@ public class XFEConsole
43
39
/// </remarks>
44
40
public static bool AutoAnalyzeObject { get; set; } = true;
45
41
/// <summary>
42
/// 是否启动日志记录
43
/// </summary>
44
public static bool EnableLog { get; set; } = false;
45
/// <summary>
46
/// 当前日志
47
/// </summary>
48
public static XFELog Log { get; set; } = new();
49
/// <summary>
46
50
/// 客户端列表
47
51
/// </summary>
48
52
public static List<XFEConsoleProgramClient> ClientList { get; set; } = [];
49
53
/// <summary>
54
/// 当前控制台输出流
55
/// </summary>
56
public static XFEConsoleTextWriter? CurrentConsoleTextWriter { get; set; }
57
/// <summary>
50
58
/// 使用XFE控制台
51
59
/// </summary>
52
60
/// <param name="ipAddress">IP地址</param>
@@ -67,6 +75,16 @@ public class XFEConsole
67
75
/// <returns>是否连接成功</returns>
68
76
public static async Task<bool> UseXFEConsole(int port = 3280, string password = "") => await UseXFEConsole($"ws://localhost:{port}/", AppDomain.CurrentDomain.FriendlyName, Guid.NewGuid().ToString(), password);
69
77
/// <summary>
78
/// 使用XFE控制台日志
79
/// </summary>
80
public static void UseXFEConsoleLog(bool autoAddTimeInfo = true, long logTextMaximizeLength = 500000000)
81
{
82
EnableLog = true;
83
Log.AutoAddTimeInfo = autoAddTimeInfo;
84
Log.LogTextMaximizeLength = logTextMaximizeLength;
85
SetConsoleOutput();
86
}
87
/// <summary>
70
88
/// 停止XFE控制台
71
89
/// </summary>
72
90
/// <returns></returns>
@@ -75,9 +93,7 @@ public class XFEConsole
75
93
if (CurrentConsoleTextWriter is not null)
76
94
Console.SetOut(CurrentConsoleTextWriter.OriginalTextWriter);
77
95
foreach (var client in ClientList)
78
{
79
96
await client.Client.CloseCyberCommClient();
80
}
81
97
}
82
98
/// <summary>
83
99
/// 设置XFE控制台
@@ -88,7 +104,6 @@ public class XFEConsole
88
104
CurrentConsoleTextWriter = new(Console.Out);
89
105
Console.SetOut(CurrentConsoleTextWriter);
90
106
}
91
92
107
/// <summary>
93
108
/// 连接XFE控制台
94
109
/// </summary>
@@ -131,8 +146,8 @@ public class XFEConsole
131
146
}
132
147
if (ShowInDebug)
133
148
Debug.WriteLine(objectInfo);
134
if (ShowInLocalConsole && Console.Out is XFEConsoleTextWriter)
135
(Console.Out as XFEConsoleTextWriter)?.OriginalTextWriter.WriteLine(objectInfo);
149
if (ShowInLocalConsole)
150
CurrentConsoleTextWriter?.OriginalTextWriter.WriteLine(objectInfo);
136
151
foreach (var client in ClientList)
137
152
await client.OutputMessage(objectInfo, true);
138
153
}
@@ -147,8 +162,16 @@ public class XFEConsole
147
162
{
148
163
if (ShowInDebug)
149
164
Debug.WriteLine(text);
150
if (ShowInLocalConsole && Console.Out is XFEConsoleTextWriter)
151
(Console.Out as XFEConsoleTextWriter)?.OriginalTextWriter.WriteLine(text);
165
if (EnableLog)
166
{
167
var log = Log.WriteLine(text, out var isHead);
168
if (ShowInLocalConsole)
169
CurrentConsoleTextWriter?.OriginalTextWriter.WriteLine($"{(Log.AutoAddTimeInfo && isHead ? XFELogEntry.TimeToString(log.Time) : string.Empty)}{text}");
170
}
171
else if (ShowInLocalConsole)
172
{
173
CurrentConsoleTextWriter?.OriginalTextWriter.WriteLine(text);
174
}
152
175
foreach (var client in ClientList)
153
176
await client.OutputMessage($"[color {ConvertConsoleColorToString(Console.ForegroundColor)} {ConvertConsoleColorToString(Console.BackgroundColor)}]{text}", true);
154
177
}
@@ -164,8 +187,16 @@ public class XFEConsole
164
187
{
165
188
if (ShowInDebug)
166
189
Debug.WriteLine(text);
167
if (ShowInLocalConsole && Console.Out is XFEConsoleTextWriter)
168
(Console.Out as XFEConsoleTextWriter)?.OriginalTextWriter.Write(text);
190
if (EnableLog)
191
{
192
var log = Log.Write(text, out var isHead);
193
if (ShowInLocalConsole)
194
CurrentConsoleTextWriter?.OriginalTextWriter.Write($"{(Log.AutoAddTimeInfo && isHead ? XFELogEntry.TimeToString(log.Time) : string.Empty)}{text}");
195
}
196
else if (ShowInLocalConsole)
197
{
198
CurrentConsoleTextWriter?.OriginalTextWriter.Write(text);
199
}
169
200
foreach (var client in ClientList)
170
201
await client.OutputMessage($"[color {ConvertConsoleColorToString(Console.ForegroundColor)} {ConvertConsoleColorToString(Console.BackgroundColor)}]{text}", false);
171
202
}
@@ -4,7 +4,7 @@
4
4
<TargetFramework>net8.0</TargetFramework>
5
5
<ImplicitUsings>enable</ImplicitUsings>
6
6
<Nullable>enable</Nullable>
7
<Version>1.0.3</Version>
7
<Version>1.1.0</Version>
8
8
<Authors>XFEstudio</Authors>
9
9
<Company>寰宇朽力网络科技</Company>
10
10
<Description>XFEConsole是一个可以运行用户进行远程输出的调试辅助工具,需要配合XFE工具箱来使用,当然也可以根据本DLL内的架构搭建一个调试工具</Description>
@@ -14,7 +14,7 @@
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>新增UseXFEConsole特性,用于添加至XUnit单元测试</PackageReleaseNotes>
17
<PackageReleaseNotes>新增日志记录功能</PackageReleaseNotes>
18
18
<PackageLicenseFile>LICENSE</PackageLicenseFile>
19
19
<GeneratePackageOnBuild>True</GeneratePackageOnBuild>
20
20
<Title>XFEExtension.NetCore.XFEConsole</Title>
@@ -37,7 +37,7 @@
37
37
</ItemGroup>
38
38
39
39
<ItemGroup>
40
<PackageReference Include="XFEExtension.NetCore" Version="3.0.2" />
40
<PackageReference Include="XFEExtension.NetCore" Version="3.2.5" />
41
41
</ItemGroup>
42
42
43
43
</Project>
@@ -0,0 +1,242 @@
1
using XFEExtension.NetCore.XFETransform;
2
3
namespace XFEExtension.NetCore.XFEConsole;
4
5
/// <summary>
6
/// XFE日志
7
/// </summary>
8
public class XFELog
9
{
10
private bool _isHead = true;
11
/// <summary>
12
/// 自动添加时间信息
13
/// </summary>
14
public bool AutoAddTimeInfo { get; set; } = false;
15
/// <summary>
16
/// 使用缓存,并在WriteLine时记录日志
17
/// </summary>
18
public bool RecordOnlyOnWriteLine { get; set; } = true;
19
/// <summary>
20
/// Log日志文件长度上限
21
/// </summary>
22
public long LogTextMaximizeLength { get; set; } = 500000000;
23
/// <summary>
24
/// 当前日志文本长度
25
/// </summary>
26
public long CurrentLogsTextLength
27
{
28
get
29
{
30
long length = 0;
31
foreach (var entry in Logs)
32
length += entry.LogText.Length;
33
return length;
34
}
35
}
36
/// <summary>
37
/// 日志路径
38
/// </summary>
39
public string LogPath { get; set; } = "Log";
40
/// <summary>
41
/// 当前日志
42
/// </summary>
43
public static XFELog? Current { get; set; }
44
/// <summary>
45
/// 缓存日志
46
/// </summary>
47
public XFELogEntry CacheLog { get; set; } = new();
48
/// <summary>
49
/// 日志条目
50
/// </summary>
51
public List<XFELogEntry> Logs { get; set; } = [];
52
/// <summary>
53
/// 日志特殊字符的转换器(如回车,换行等)
54
/// </summary>
55
public EscapeConverter[] Converters { get; set; } = [new("\n", "\\n", "n", "\\"), new("\r", "\\r", "r", "\\")];
56
/// <summary>
57
/// XFE日志
58
/// </summary>
59
public XFELog() => Current = this;
60
private void RemoveOverflow()
61
{
62
var currentLength = CurrentLogsTextLength;
63
while (currentLength > LogTextMaximizeLength)
64
{
65
currentLength -= Logs[0].LogText.Length;
66
Logs.RemoveAt(0);
67
}
68
}
69
/// <summary>
70
/// 添加一条日志
71
/// </summary>
72
/// <param name="xFELogEntry">日志条目</param>
73
public void AddLog(XFELogEntry xFELogEntry)
74
{
75
Logs.Add(xFELogEntry);
76
RemoveOverflow();
77
}
78
/// <summary>
79
/// 导出当前全部日志为文本
80
/// </summary>
81
/// <returns>日志文本</returns>
82
public string Export() => string.Join("\n", Logs.Select(log => log.ToString(Converters)));
83
/// <summary>
84
/// 导出指定日期区间的日志为文本
85
/// </summary>
86
/// <returns>日志文本</returns>
87
public string Export(DateTime startDateTime, DateTime endDateTime) => string.Join("\n", Logs.Where(log => log.Time >= startDateTime && log.Time <= endDateTime).Select(log => log.ToString(Converters)));
88
/// <summary>
89
/// 导出当前全部日志原文为文本
90
/// </summary>
91
/// <returns>日志文本</returns>
92
public string ExportOriginal() => string.Join("\n", Logs.Select(log => log.ToString()));
93
/// <summary>
94
/// 导入日志
95
/// </summary>
96
/// <param name="logText">日志文本</param>
97
public void Import(string logText)
98
{
99
foreach (var log in logText.Split('\n', StringSplitOptions.RemoveEmptyEntries))
100
{
101
if (log is not null && XFELogEntry.FromString(log, Converters) is XFELogEntry xFELogEntry)
102
AddLog(xFELogEntry);
103
}
104
}
105
/// <summary>
106
/// 清除全部日志
107
/// </summary>
108
public void Clear() => Logs.Clear();
109
/// <summary>
110
/// 添加一条日志
111
/// </summary>
112
/// <param name="logText">日志文本</param>
113
/// <param name="dateTime">日志记录时间</param>
114
/// <param name="logLevel">日志级别</param>
115
/// <returns>日志条目</returns>
116
public XFELogEntry AddLog(string logText, DateTime dateTime, LogLevel logLevel = LogLevel.Info)
117
{
118
var entry = new XFELogEntry
119
{
120
Time = dateTime,
121
Level = logLevel,
122
LogText = logText
123
};
124
AddLog(entry);
125
return entry;
126
}
127
/// <summary>
128
/// 添加一条日志
129
/// </summary>
130
/// <param name="logText">日志文本</param>
131
/// <param name="logLevel">日志级别</param>
132
/// <returns>日志条目</returns>
133
public XFELogEntry AddLog(string logText, LogLevel logLevel = LogLevel.Info) => AddLog(logText, DateTime.Now, logLevel);
134
/// <summary>
135
/// 记录
136
/// </summary>
137
/// <param name="logText">文本</param>
138
/// <param name="isHead">是否是一行的开头</param>
139
/// <returns></returns>
140
public XFELogEntry Write(string logText, out bool isHead)
141
{
142
isHead = _isHead;
143
_isHead = false;
144
var logLevel = isHead ? LogLevel.Info : CacheLog.Level;
145
try
146
{
147
var split = logText.Split(['[', ']'], StringSplitOptions.RemoveEmptyEntries);
148
if (split.Length > 1)
149
{
150
if (!TryConverterToLogLevel(split[0], out logLevel))
151
logLevel = isHead ? LogLevel.Info : CacheLog.Level;
152
else
153
logText = split[1];
154
}
155
}
156
catch { }
157
if (RecordOnlyOnWriteLine)
158
{
159
if (isHead)
160
{
161
CacheLog = AddLog(logText, logLevel);
162
return CacheLog;
163
}
164
CacheLog.Level = logLevel;
165
CacheLog.LogText += logText;
166
return CacheLog;
167
}
168
else
169
{
170
return AddLog(logText, logLevel);
171
}
172
}
173
/// <summary>
174
/// 记录一行
175
/// </summary>
176
/// <param name="logText">文本</param>
177
/// <param name="isHead">是否是一行的开头</param>
178
/// <returns></returns>
179
public XFELogEntry WriteLine(string logText, out bool isHead)
180
{
181
isHead = _isHead;
182
_isHead = true;
183
var logLevel = isHead ? LogLevel.Info : CacheLog.Level;
184
try
185
{
186
var split = logText.Split(['[', ']'], StringSplitOptions.RemoveEmptyEntries);
187
if (split.Length > 1)
188
{
189
if (!TryConverterToLogLevel(split[0], out logLevel))
190
logLevel = isHead ? LogLevel.Info : CacheLog.Level;
191
else
192
logText = split[1];
193
}
194
}
195
catch { }
196
if (RecordOnlyOnWriteLine)
197
{
198
if (isHead)
199
return AddLog(logText, logLevel);
200
CacheLog.Level = logLevel;
201
CacheLog.LogText += logText;
202
return CacheLog;
203
}
204
else
205
{
206
return AddLog(logText, logLevel);
207
}
208
}
209
/// <summary>
210
/// 尝试转换为警示等级
211
/// </summary>
212
/// <param name="logLevelText">警示等级文本</param>
213
/// <param name="logLevel">警示等级</param>
214
/// <returns>是否成功</returns>
215
public static bool TryConverterToLogLevel(string logLevelText, out LogLevel logLevel)
216
{
217
logLevel = LogLevel.Info;
218
switch (logLevelText)
219
{
220
case "TRACE":
221
logLevel = LogLevel.Trace;
222
return true;
223
case "DEBUG":
224
logLevel = LogLevel.Debug;
225
return true;
226
case "INFO":
227
logLevel = LogLevel.Info;
228
return true;
229
case "WARN":
230
logLevel = LogLevel.Warning;
231
return true;
232
case "ERROR":
233
logLevel = LogLevel.Error;
234
return true;
235
case "FATAL":
236
logLevel = LogLevel.Fatal;
237
return true;
238
default:
239
return false;
240
}
241
}
242
}
@@ -0,0 +1,100 @@
1
using XFEExtension.NetCore.XFETransform;
2
3
namespace XFEExtension.NetCore.XFEConsole;
4
5
/// <summary>
6
/// 日志条目
7
/// </summary>
8
public class XFELogEntry
9
{
10
/// <summary>
11
/// 日志记录时间
12
/// </summary>
13
public DateTime Time { get; set; } = DateTime.Now;
14
/// <summary>
15
/// 日志级别
16
/// </summary>
17
public LogLevel Level { get; set; } = LogLevel.Info;
18
/// <summary>
19
/// 日志文本
20
/// </summary>
21
public string LogText { get; set; } = string.Empty;
22
/// <summary>
23
/// 转为日志文本(含时间)
24
/// </summary>
25
/// <returns></returns>
26
public override string ToString() => $"{TimeToString(Time)}{LevelToString(Level)}{LogText.Replace("\n", "\\n").Replace("\r", "\\r")}";
27
/// <summary>
28
/// 转为日志文本(含时间)
29
/// </summary>
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
}
38
39
/// <summary>
40
/// 日期转字符串
41
/// </summary>
42
public static string TimeToString(DateTime dateTime) => $"[{dateTime:yyyy-MM-dd HH:mm:ss}]";
43
/// <summary>
44
/// 字符串转日期
45
/// </summary>
46
public static DateTime StringToTime(string dateTime) => DateTime.Parse(dateTime.Replace("[", string.Empty).Replace("]", string.Empty));
47
/// <summary>
48
/// 警示级转字符串
49
/// </summary>
50
/// <returns></returns>
51
/// <exception cref="NotImplementedException"></exception>
52
public static string LevelToString(LogLevel logLevel) => logLevel switch
53
{
54
LogLevel.Trace => "[TRACE]",
55
LogLevel.Debug => "[DEBUG]",
56
LogLevel.Info => "[INFO]",
57
LogLevel.Warning => "[WARN]",
58
LogLevel.Error => "[ERROR]",
59
LogLevel.Fatal => "[FATAL]",
60
_ => throw new NotImplementedException()
61
};
62
/// <summary>
63
/// 字符串转警示级别
64
/// </summary>
65
/// <returns></returns>
66
/// <exception cref="NotImplementedException"></exception>
67
public static LogLevel StringToLevel(string logLevel) => logLevel.Replace("[", string.Empty).Replace("]", string.Empty) switch
68
{
69
"TRACE" => LogLevel.Trace,
70
"DEBUG" => LogLevel.Debug,
71
"INFO" => LogLevel.Info,
72
"WARN" => LogLevel.Warning,
73
"ERROR" => LogLevel.Error,
74
"FATAL" => LogLevel.Fatal,
75
_ => throw new NotImplementedException()
76
};
77
/// <summary>
78
/// 从字符串中创建
79
/// </summary>
80
/// <param name="logString">日志文本</param>
81
/// <param name="converters">转换器</param>
82
/// <returns></returns>
83
public static XFELogEntry? FromString(string logString, params EscapeConverter[] converters)
84
{
85
var split = logString.Split(['[', ']'], StringSplitOptions.RemoveEmptyEntries);
86
if (split.Length > 2)
87
{
88
var logText = split[2];
89
foreach (var converter in converters)
90
logText = converter.Inverse(logText);
91
return new()
92
{
93
Time = StringToTime(split[0]),
94
Level = StringToLevel(split[1]),
95
LogText = logText
96
};
97
}
98
return null;
99
}
100
}