C# 将日志导出到2个txt文件

问题描述 投票:0回答:1

所以我有一个由我的 xaml 文件(视图)制成的按钮,称为“导出”。 当用户单击它时,应用程序运行期间创建的日志将导出到 Logs.txt。 如果存在警告、错误或异常,这些内容将在另一个名为 ErrorLogs.txt 的 txt 文件中创建

现在这是我的代码:

private bool IsErrorLog(string logText)
{
    
    return logText.Contains(LogType.Error.ToString()) || logText.Contains(LogType.Warning.ToString()) || logText.Contains(Exception);

}

private void btn_ExportLogs_Click(object sender, RoutedEventArgs e)
{
    string logsFolder = "LogsFolder"; // Folder for logs
    if (!Directory.Exists(logsFolder))
    {
        Directory.CreateDirectory(logsFolder);
    }


    string timestamp = DateTime.Now.ToString("hhmmss");
    string logFileName = Path.Combine(logsFolder, $"Logs_{timestamp}.txt");
    string errorLogFileName = Path.Combine(logsFolder, $"ErrorLog_{timestamp}.txt");



    using (StreamWriter logWriter = new StreamWriter(logFileName))
    
    {

        foreach (var item in LogGrid.Children)
        {

            logFileName = $"{item}";
            logWriter.WriteLine(logFileName);

            if (IsErrorLog(logFileName))
            {
                using (StreamWriter errorLogWriter = new StreamWriter(errorLogFileName))
                errorLogWriter.WriteLine(errorLogFileName);
            }
        }

    }
}

我的问题首先是我不知道如何在 isError 方法返回中添加异常。 它说““Exception”是一种类型,在给定的上下文中无效”

我尝试创建第二个参数 Exception ex,但随后我需要在 btn_ExportLogs_Click 方法的 if 中使用第二个参数,但我不知道应该放在那里。

我的第二个问题是,即使使用此代码,所有日志也仅在日志文件中,即使我尝试在应用程序中犯一些错误(例如删除不再存在的内容),它仍然会将其放入日志文件像所有其他日志一样,而不是创建 ErrorLogs.txt 并将其放在那里。

我尝试将 using 放入 if 中,但它永远不会创建,因为所有日志都在日志中,当我将 using 放在另一个 using 之下时,它始终创建 txt 文件,但始终为空。

我尝试创建第二个参数 Exception ex,但随后我需要在 btn_ExportLogs_Click 方法的 if 中使用第二个参数,但我不知道应该放在那里。

我尝试将“using”(errorLogWritter)放入if中,但它永远不会创建错误文件,因为所有日志都在Logs.txt中,并且当我将“using”放在另一个“using”(logWritter)下方时,它总是创建txt文件,但由于同样的原因总是空的。

总而言之,我希望当我在应用程序上执行随机操作时,当我单击导出按钮(这意味着调用该方法)时,在首页创建的日志将导出到 Logs.txt,但如果有LogType.Warning 或/和 LogType.Error 或/和 Exceptions 将它们放入名为 ErrorLogs.txt 的单独 txt 文件中

我有其他类,但也有一个主类,其中每个操作都会记录一条消息,最后我说 LogType 是什么。我期待我写的内容能抓住这一点,并区分正常的 LogType.Info 和警告和错误。

我希望我说清楚了,如果我没说清楚,我很抱歉。

我尝试阅读大量的论坛和文档,但找不到对我有帮助的东西。

c# exception logging export streamwriter
1个回答
0
投票

想发表评论,但文字太多。当我更仔细地看时,你的代码对我来说没有多大意义。

我猜你的

item
是一个包含你的日志消息的字符串。那为什么要分配
logFileName = $"{item}"
呢?那是没有必要的。您可以将项目直接写入日志。

接下来是线路

errorLogWriter.WriteLine(errorLogFileName);

您的 errorLogFileName 是错误日志文件的路径。所以这段代码只会将文件路径写入该文件,而不是错误消息。

另请注意,如果您的

IsErrorLog
检查返回 true,则您的日志字符串(在当前逻辑中)应写入两次:一次在简单日志中,一次在错误日志中(据我所知,您不希望出现这种行为)。

顺便说一句,您想检查日志字符串是否包含警告、错误、异常。最好的方法是有一个标记,指出您的日志是警告、错误或异常。有些记录器将日志级别写为3个字母;例如,这是信息日志字符串(标记为

INF
):

[10:39:35 INF] Executed endpoint ...

因此,考虑到上述所有内容,并假设您的日志字符串包含一些标记,以便您可以确定其日志级别,我会将您的代码重写为:

private bool IsErrorLog(string logText)
{
    
    return IsErrorLog(logTest) || IsWarningLog(logText) || IsExceptionLog(logText);
}

private bool IsErrorLog(string logText)
{
    return logText.Contains("ERR"); // change it for your needs
}

private bool IsWarningLog(string logText)
{
    return logText.Contains("WRN"); // change it for your needs
}

private bool IsExceptionLog(string logText)
{
    return logText.Contains("EXC"); // change it for your needs
}

private void btn_ExportLogs_Click(object sender, RoutedEventArgs e)
{
    string logsFolder = "LogsFolder"; // Folder for logs
    if (!Directory.Exists(logsFolder))
    {
        Directory.CreateDirectory(logsFolder);
    }

    string timestamp = DateTime.Now.ToString("hhmmss");
    string logFileName = Path.Combine(logsFolder, $"Logs_{timestamp}.txt");
    string errorLogFileName = Path.Combine(logsFolder, $"ErrorLog_{timestamp}.txt");

    using (StreamWriter logWriter = new StreamWriter(logFileName))  
    {
        using (StreamWriter errorLogWriter = new StreamWriter(errorLogFileName))
        {
            foreach (var item in LogGrid.Children)
            {
                if (IsErrorLog(logFileName))
                {
                    errorLogWriter.WriteLine(item);
                    continue;
                }

                logWriter.WriteLine(logFileName);
            }
        }
    }
}

上面的代码创建了 2 个流编写器(因此不会在

foreach
循环内重新初始化)。然后,它检查您的
item
是否应该写入错误或简单日志。如果应该写入错误日志,则将其写入并继续循环。否则,日志文本将写入简单日志文件。

希望这是清楚的。

© www.soinside.com 2019 - 2024. All rights reserved.