You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#日志分文件导出问题求助:区分普通日志与错误日志

问题修复方案

问题原因分析

  1. IsErrorLog方法语法错误:直接引用Exception类型作为Contains的参数,这是无效用法,应该判断日志文本中是否包含LogType.Exception枚举值的字符串形式。
  2. 错误日志写入逻辑混乱:
    • 每次循环都创建新的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_

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 09:35:01