C#中File.WriteAllTextAsync无法写入Exception.Message至日志文件求助
日志写入异常问题修复方案
核心问题分析
- 异步操作未等待:
File.WriteAllTextAsync是异步方法,代码中未使用await关键字等待操作完成,后续的Thread.Sleep和Environment.Exit(0)会直接终止程序,导致写入操作还未执行就被中断。 - 文件流冲突:在
using (FileStream fs = File.Create(pathString))块内调用WriteAllTextAsync,此时文件流未释放,文件处于锁定状态,写入操作无法正常执行。 - 路径变量不一致:代码中创建文件用
pathString,写入用fileName,若两个变量指向不同路径,会导致日志写入到错误位置或创建空文件。
修复后的代码示例
同步版本(更适合控制台场景)
catch (Exception e) { if (logs) { Console.WriteLine("Error detected, saved to logs."); // 统一日志文件路径变量,确保创建和写入路径一致 string logFilePath = fileName; // 若pathString是正确路径,替换为pathString // 创建文件后立即释放流,避免锁定 if (!File.Exists(logFilePath)) { File.Create(logFilePath).Dispose(); } // 使用AppendAllText保留历史日志,添加换行便于阅读 File.AppendAllText(logFilePath, $"{DateTime.Now:yyyy-MM-dd HH:mm:ss} - {e.Message}{Environment.NewLine}"); Console.WriteLine("Closing in 5 seconds."); Thread.Sleep(5000); Environment.Exit(0); } else { Console.WriteLine("Error detected, closing in 5 seconds."); Thread.Sleep(5000); Environment.Exit(0); } }
异步版本(需确保方法标记为async)
catch (Exception e) { if (logs) { Console.WriteLine("Error detected, saved to logs."); string logFilePath = fileName; if (!File.Exists(logFilePath)) { await File.CreateAsync(logFilePath); } await File.AppendAllTextAsync(logFilePath, $"{DateTime.Now:yyyy-MM-dd HH:mm:ss} - {e.Message}{Environment.NewLine}"); Console.WriteLine("Closing in 5 seconds."); Thread.Sleep(5000); Environment.Exit(0); } else { Console.WriteLine("Error detected, closing in 5 seconds."); Thread.Sleep(5000); Environment.Exit(0); } }
额外优化建议
- 统一日志路径变量,避免
pathString和fileName混淆,减少路径错误风险。 - 日志中添加时间戳,便于追踪错误发生时间。
- 若需更健壮的日志功能,可考虑使用第三方日志库(如Serilog、NLog),简化日志操作并提供更多功能。
内容的提问来源于stack exchange,提问作者ThatOneHen
相关产品推荐
相关产品推荐

