优化代码
This commit is contained in:
@@ -22,13 +22,7 @@ public class LogController(ILogger<LogController> logger) : ControllerBase
|
||||
var logDirectory = Path.Combine(Directory.GetCurrentDirectory(), "logs");
|
||||
if (!Directory.Exists(logDirectory))
|
||||
{
|
||||
return new PagedResponse<LogEntry>
|
||||
{
|
||||
Success = true,
|
||||
Data = [],
|
||||
Total = 0,
|
||||
Message = "日志目录不存在"
|
||||
};
|
||||
return PagedResponse<LogEntry>.Fail("日志目录不存在");
|
||||
}
|
||||
|
||||
// 确定要读取的日志文件
|
||||
@@ -47,43 +41,25 @@ public class LogController(ILogger<LogController> logger) : ControllerBase
|
||||
// 检查文件是否存在
|
||||
if (!System.IO.File.Exists(logFilePath))
|
||||
{
|
||||
return new PagedResponse<LogEntry>
|
||||
{
|
||||
Success = true,
|
||||
Data = [],
|
||||
Total = 0,
|
||||
Message = "日志文件不存在"
|
||||
};
|
||||
return PagedResponse<LogEntry>.Done([], 0);
|
||||
}
|
||||
|
||||
// 流式读取日志(边读边过滤,满足条件后停止)
|
||||
var (logEntries, total) = await ReadLogsStreamAsync(
|
||||
logFilePath,
|
||||
pageIndex,
|
||||
pageSize,
|
||||
searchKeyword,
|
||||
var (logEntries, total) = await ReadLogsAsync(
|
||||
logFilePath,
|
||||
pageIndex,
|
||||
pageSize,
|
||||
searchKeyword,
|
||||
logLevel);
|
||||
|
||||
var pagedData = logEntries;
|
||||
|
||||
return new PagedResponse<LogEntry>
|
||||
{
|
||||
Success = true,
|
||||
Data = pagedData.ToArray(),
|
||||
Total = total,
|
||||
Message = "获取日志成功"
|
||||
};
|
||||
return PagedResponse<LogEntry>.Done(pagedData.ToArray(), total);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
logger.LogError(ex, "获取日志失败");
|
||||
return new PagedResponse<LogEntry>
|
||||
{
|
||||
Success = false,
|
||||
Data = [],
|
||||
Total = 0,
|
||||
Message = $"获取日志失败: {ex.Message}"
|
||||
};
|
||||
return PagedResponse<LogEntry>.Fail($"获取日志失败: {ex.Message}");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -91,14 +67,14 @@ public class LogController(ILogger<LogController> logger) : ControllerBase
|
||||
/// 获取可用的日志日期列表
|
||||
/// </summary>
|
||||
[HttpGet]
|
||||
public IActionResult GetAvailableDates()
|
||||
public BaseResponse<string[]> GetAvailableDates()
|
||||
{
|
||||
try
|
||||
{
|
||||
var logDirectory = Path.Combine(Directory.GetCurrentDirectory(), "logs");
|
||||
if (!Directory.Exists(logDirectory))
|
||||
{
|
||||
return Ok(new { success = true, data = new List<string>() });
|
||||
return ((string[])[]).Ok();
|
||||
}
|
||||
|
||||
var logFiles = Directory.GetFiles(logDirectory, "log-*.txt");
|
||||
@@ -108,12 +84,12 @@ public class LogController(ILogger<LogController> logger) : ControllerBase
|
||||
.OrderByDescending(d => d)
|
||||
.ToList();
|
||||
|
||||
return Ok(new { success = true, data = dates });
|
||||
return dates.ToArray().Ok();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
logger.LogError(ex, "获取日志日期列表失败");
|
||||
return Ok(new { success = false, message = $"获取日志日期列表失败: {ex.Message}" });
|
||||
return $"获取日志日期列表失败: {ex.Message}".Fail<string[]>();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -124,7 +100,7 @@ public class LogController(ILogger<LogController> logger) : ControllerBase
|
||||
{
|
||||
var mergedLines = new List<string>();
|
||||
var currentLog = new StringBuilder();
|
||||
|
||||
|
||||
// 日志行开始的正则表达式
|
||||
var logStartPattern = new System.Text.RegularExpressions.Regex(
|
||||
@"^\[\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\.\d{3} [+-]\d{2}:\d{2}\]"
|
||||
@@ -206,19 +182,17 @@ public class LogController(ILogger<LogController> logger) : ControllerBase
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 流式读取日志(真正的流式:只读取需要的数据,满足后立即停止)
|
||||
/// 读取日志
|
||||
/// </summary>
|
||||
private async Task<(List<LogEntry> entries, int total)> ReadLogsStreamAsync(
|
||||
private async Task<(List<LogEntry> entries, int total)> ReadLogsAsync(
|
||||
string path,
|
||||
int pageIndex,
|
||||
int pageSize,
|
||||
string? searchKeyword,
|
||||
string? logLevel)
|
||||
{
|
||||
// 简化:一次性读取所有行,合并多行日志,过滤并在内存中分页
|
||||
var allLines = await ReadAllLinesAsync(path);
|
||||
|
||||
// 合并多行日志为独立条目
|
||||
var merged = MergeMultiLineLog(allLines);
|
||||
|
||||
var parsed = new List<LogEntry>();
|
||||
@@ -231,7 +205,6 @@ public class LogController(ILogger<LogController> logger) : ControllerBase
|
||||
}
|
||||
}
|
||||
|
||||
// 倒序(最新在前)
|
||||
parsed.Reverse();
|
||||
|
||||
var total = parsed.Count;
|
||||
@@ -267,11 +240,11 @@ public class LogController(ILogger<LogController> logger) : ControllerBase
|
||||
private async Task<string[]> ReadAllLinesAsync(string path)
|
||||
{
|
||||
var lines = new List<string>();
|
||||
|
||||
|
||||
using (var fileStream = new FileStream(
|
||||
path,
|
||||
FileMode.Open,
|
||||
FileAccess.Read,
|
||||
path,
|
||||
FileMode.Open,
|
||||
FileAccess.Read,
|
||||
FileShare.ReadWrite))
|
||||
using (var streamReader = new StreamReader(fileStream))
|
||||
{
|
||||
@@ -281,7 +254,7 @@ public class LogController(ILogger<LogController> logger) : ControllerBase
|
||||
lines.Add(line);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return lines.ToArray();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user