当 运行 并行测试时,使用 log4net 创建的日志变得混杂

Logs created with log4net are getting mixed when running tests in parallel

我有一个使用 log4net 的 NUnit 测试并生成了一个不错的日志,如下所示:

[2017-07-20 INFO] Test children 00: Started
[2017-07-20 INFO] Test children 00: Log line 1
[2017-07-20 INFO] Test children 00: Log line 2
[2017-07-20 INFO] Test children 00: Log line 3
[2017-07-20 INFO] Test children 00: Completed

如果我创建此测试的多个子项(使用 TestCaseSource)并运行它们并行日志变得丑陋,来自不同测试子项的行是混合的。

我希望看到这样的内容(请注意来自测试子项的所有日志都分组在一起)

[2017-07-20 INFO] Test children 00: Started
[2017-07-20 INFO] Test children 00: Log line 1
[2017-07-20 INFO] Test children 00: Log line 2
[2017-07-20 INFO] Test children 00: Log line 3
[2017-07-20 INFO] Test children 00: Completed
[2017-07-20 INFO] Test children 01: Started
[2017-07-20 INFO] Test children 01: Log line 1
[2017-07-20 INFO] Test children 01: Log line 2
[2017-07-20 INFO] Test children 01: Log line 3
[2017-07-20 INFO] Test children 01: Completed

实际上我得到了这样的结果(请注意来自不同测试子项的日志是混合的)

[2017-07-20 INFO] Test children 00: Started
[2017-07-20 INFO] Test children 01: Started
[2017-07-20 INFO] Test children 00: Log line 1
[2017-07-20 INFO] Test children 01: Log line 1
[2017-07-20 INFO] Test children 00: Log line 2
[2017-07-20 INFO] Test children 01: Log line 2
[2017-07-20 INFO] Test children 01: Log line 3
[2017-07-20 INFO] Test children 00: Log line 3
[2017-07-20 INFO] Test children 01: Completed
[2017-07-20 INFO] Test children 00: Completed

有没有办法配置 log4net 以将来自一个线程的日志放在一起?

我会避免在单元测试期间依赖外部组件进行日志记录。最好避免在单元测试期间依赖任何外部依赖项,因为这意味着您的测试不会与被测单元隔离。

如果您向被测单元提供 ILog,而不是提供 log4net 实现,请提供可能只写入控制台的存根实现(Console.WriteLine,等等)。在测试期间写入控制台的所有内容都将可见 post-test 并与该测试相关联。

如果您出于某种原因必须使用 log4net,请在您的 log4net 配置中使用 ConsoleAppender 而不是 FileAppender