C# 并行运行测试时,如何将日志写入不同的文件?
在我的测试报告之前,我使用诱惑框架,它允许我将文件附加到测试。我还使用SpecFlow,所以我想在每个测试步骤中附加一个日志文件。诱惑允许我这么做 然而,当我的测试并行运行时,我不知道如何以正确的方式执行它 因此,我需要的是将每个测试的日志写入一个文件中,我可以独立于其他日志文件进行处理,这些日志文件来自并行运行的测试 在并行运行测试之前,我有一个类似这样的类:C# 并行运行测试时,如何将日志写入不同的文件?,c#,logging,parallel-processing,automation,C#,Logging,Parallel Processing,Automation,在我的测试报告之前,我使用诱惑框架,它允许我将文件附加到测试。我还使用SpecFlow,所以我想在每个测试步骤中附加一个日志文件。诱惑允许我这么做 然而,当我的测试并行运行时,我不知道如何以正确的方式执行它 因此,我需要的是将每个测试的日志写入一个文件中,我可以独立于其他日志文件进行处理,这些日志文件来自并行运行的测试 在并行运行测试之前,我有一个类似这样的类: public static class Log { private static readonly string LogFil
public static class Log
{
private static readonly string LogFileName = "testlog.json";
public static bool IsFileExist => File.Exists(LogFileName);
public static void WriteLine(string value)
{
File.AppendAllText(LogFileName, value);
}
public static string GetLogPath()
{
return LogFileName;
}
}
然后我有一个SpecFlow钩子:
[AfterStep()]
public void AfterStep()
{
if (Log.IsFileExist)
{
string logFilePath = Log.GetLogPath();
AllureLifecycle.Instance.AddAttachment("displayedFileName", "application/json", logFilePath);
//Clean log file
DeleteTestLogFile();
}
}
所以,一旦日志文件附加到我的报告中,我就将其删除,并在下一步再次创建它
现在,当我并行运行测试时,当然不能从多个线程访问文件
我该怎么办?也许我用的不是很好的解决方案?如果是这样的话,请建议一个足够的方法来执行我想要的操作。最简单的解决方案就是对写入文件的代码使用锁
public static class Log
{
private static readonly string LogFileName = "testlog.json";
private static Object myLock = new Object();
public static bool IsFileExist => File.Exists(LogFileName);
public static void WriteLine(string value)
{
lock (myLock )
{
File.AppendAllText(LogFileName, value);
}
}
public static string GetLogPath()
{
return LogFileName;
}
}
如果这最终导致性能问题,您可以尝试将日志添加到ConcurrentQueue,让另一个线程监视它并写入实际文件 如果测试运行程序使用多个AppDomains@bcwhims谢谢,它有助于文件锁定,但如果将来自不同测试的日志混合到一个文件中则不会。@DenisKoreyba您介意分享您的解决方案吗?我现在遇到了同样的挑战。使用Log4Net。不要再创造新的环境wheel@MickyD谢谢,我试试看。但也许你可以举个例子作为答案?