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

XFEstudio/XFEExtension.NetCore.XFEConsole

完善日志记录功能

4ffce9d
XFE工作室室长 <mail@xfegzs.com>
提交于

代码差异

7 个文件 +486 -29
Modified README.md +34 -4
@@ -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 ```
Modified XFEExtension.NetCore.XFEConsole.Test/Program.cs +29 -7
@@ -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("完成");
Added XFEExtension.NetCore.XFEConsole/LogLevel.cs +32 -0
@@ -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 }
Modified XFEExtension.NetCore.XFEConsole/XFEConsole.cs +46 -15
@@ -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 }
Modified XFEExtension.NetCore.XFEConsole/XFEExtension.NetCore.XFEConsole.csproj +3 -3
@@ -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>
Added XFEExtension.NetCore.XFEConsole/XFELog.cs +242 -0
@@ -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 }
Added XFEExtension.NetCore.XFEConsole/XFELogEntry.cs +100 -0
@@ -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 }