Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 并行运行测试时,如何将日志写入不同的文件?_C#_Logging_Parallel Processing_Automation - Fatal编程技术网

C# 并行运行测试时,如何将日志写入不同的文件?

C# 并行运行测试时,如何将日志写入不同的文件?,c#,logging,parallel-processing,automation,C#,Logging,Parallel Processing,Automation,在我的测试报告之前,我使用诱惑框架,它允许我将文件附加到测试。我还使用SpecFlow,所以我想在每个测试步骤中附加一个日志文件。诱惑允许我这么做 然而,当我的测试并行运行时,我不知道如何以正确的方式执行它 因此,我需要的是将每个测试的日志写入一个文件中,我可以独立于其他日志文件进行处理,这些日志文件来自并行运行的测试 在并行运行测试之前,我有一个类似这样的类: public static class Log { private static readonly string LogFil

在我的测试报告之前,我使用诱惑框架,它允许我将文件附加到测试。我还使用SpecFlow,所以我想在每个测试步骤中附加一个日志文件。诱惑允许我这么做

然而,当我的测试并行运行时,我不知道如何以正确的方式执行它

因此,我需要的是将每个测试的日志写入一个文件中,我可以独立于其他日志文件进行处理,这些日志文件来自并行运行的测试

在并行运行测试之前,我有一个类似这样的类:

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谢谢,我试试看。但也许你可以举个例子作为答案?