如何使用CSVHelper导出已收集的错误列表生成CSV文件
解决方案
1. 简化错误实体类的创建方法
原GetErrors方法每次返回单元素列表无实际意义,修改为直接返回单条错误实例:
public class ErrorLogging { public string ErrorType { get; set; } public string Relation { get; set; } public string Message { get; set; } public static ErrorLogging Create(string type, string relating, string message) { return new ErrorLogging { ErrorType = type, Relation = relating, Message = message }; } }
2. 新增全局错误收集容器
在Program.cs代码入口处初始化一个列表,用于存储所有运行过程中产生的错误记录:
// 放在Program.cs最顶部,服务/配置初始化完成后即可声明 var errorLogs = new List<ErrorLogging>();
3. 修改错误触发逻辑
所有产生错误的分支,将生成的错误实例加入全局收集列表:
if (validateRoleTitles is not false) { log.Information("Roles found"); } else { log.Warning("Roles could not be found"); // 将错误添加到全局列表 errorLogs.Add(ErrorLogging.Create("Warning", "Database", "Not all roles found in the database")); } // 其余所有错误场景都按上述写法添加即可
4. 调用导出方法
程序执行完毕或者需要导出日志的节点,直接将全局列表传入导出方法:
// 可选:先判断列表是否为空,避免生成无意义的空文件 if (errorLogs.Any()) { ExportLog.Log(config.ExportFolder, exportFile, errorLogs); }
额外优化建议
原ExportLog类中的路径拼接写法不规范,Path.Combine会自动处理不同系统的路径分隔符,不需要手动拼接斜杠,修改后兼容性更好:
class ExportLog { public static void Log<T>(string path, string file, List<T> report) { // 修正路径拼接写法 var csvPath = Path.Combine(path, file); using (var streamWriter = new StreamWriter(csvPath)) using (var csvWriter = new CsvWriter(streamWriter, CultureInfo.InvariantCulture)) { csvWriter.WriteRecords(report); } } }
如果你的应用是多线程运行场景,请将全局收集列表替换为线程安全的ConcurrentBag<ErrorLogging>,避免并发写入抛出异常。
内容的提问来源于stack exchange,提问作者lross15
相关产品推荐
相关产品推荐

