所以我有一个由我的 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 和警告和错误。
我希望我说清楚了,如果我没说清楚,我很抱歉。
我尝试阅读大量的论坛和文档,但找不到对我有帮助的东西。
想发表评论,但文字太多。当我更仔细地看时,你的代码对我来说没有多大意义。
我猜你的
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
是否应该写入错误或简单日志。如果应该写入错误日志,则将其写入并继续循环。否则,日志文本将写入简单日志文件。
希望这是清楚的。