C#日志分文件导出问题求助:区分普通日志与错误日志
问题修复方案
问题原因分析
- IsErrorLog方法语法错误:直接引用
Exception类型作为Contains的参数,这是无效用法,应该判断日志文本中是否包含LogType.Exception枚举值的字符串形式。 - 错误日志写入逻辑混乱:
- 每次循环都创建新的
StreamWriter,默认模式会覆盖文件,导致错误日志文件最终只有最后一条记录或为空 - 错误日志写入的是文件名而非实际日志内容
- 变量命名冲突:原本存储日志文件路径的
logFileName被循环内的日志内容覆盖,引发逻辑混乱
- 每次循环都创建新的
修正后的代码
// 修正日志类型判断方法 private bool IsErrorLog(string logText) { return logText.Contains(LogType.Error.ToString()) || logText.Contains(LogType.Warning.ToString()) || logText.Contains(LogType.Exception.ToString()); } private void btn_ExportLogs_Click(object sender, RoutedEventArgs e) { string logsFolder = "LogsFolder"; if (!Directory.Exists(logsFolder)) { Directory.CreateDirectory(logsFolder); } string timestamp = DateTime.Now.ToString("HHmmss"); // 改用24小时制避免同名文件 string logFilePath = Path.Combine(logsFolder, $"Logs_{timestamp}.txt"); string errorLogFilePath = Path.Combine(logsFolder, $"ErrorLog_{timestamp}.txt"); // 同时打开两个日志流,统一管理生命周期 using (StreamWriter logWriter = new StreamWriter(logFilePath)) using (StreamWriter errorLogWriter = new StreamWriter(errorLogFilePath)) { foreach (var item in LogGrid.Children) { string logContent = $"{item}"; // 所有日志写入普通日志文件 logWriter.WriteLine(logContent); // 错误类日志额外写入错误日志文件 if (IsErrorLog(logContent)) { errorLogWriter.WriteLine(logContent); } } } }
关键修改说明
- 修正
IsErrorLog方法:将Exception改为LogType.Exception.ToString(),正确匹配枚举值的字符串标识 - 变量重命名:用
logFilePath存储日志文件路径,循环内的日志内容用logContent存储,避免命名冲突 - 调整流作用域:将错误日志的
StreamWriter移到循环外,和普通日志流一起放在using块中,避免重复创建导致文件覆盖 - 写入正确内容:错误日志写入实际日志内容而非文件名
- 优化时间戳:改用24小时制格式,避免上午下午相同时间生成重复文件名
内容的提问来源于stack exchange,提问作者PinkGoat_
相关产品推荐
相关产品推荐

