Как дать имя тестового примера для журнала 4net файл журнала для каждого отдельного теста - PullRequest
0 голосов
/ 22 апреля 2020

Я попытался внедрить журнал 4net для моей инфраструктуры автоматизации. Я не написал файл конфигурации XML. Я использовал кодовый файл только для его настройки.

 class log4netHelper
{    
        private static ILog _logger;
        private static ConsoleAppender _conAppender;
        private static FileAppender _fileAppender;
        private static RollingFileAppender _rollingFileAppender;
        private static string _layout = "%date{ABSOLUTE} [%class] [%level] [%method] - %message%newline";


        public static string Layout
        {
            set { _layout = value; }
        }

        private static PatternLayout GetPatternLayout()
        {
            var patternLayout = new PatternLayout()
            {
                ConversionPattern = _layout
            };

            patternLayout.ActivateOptions();
            return patternLayout;
        }
        private static ConsoleAppender GetConsoleAppender()
        {
            var consoleAppender = new ConsoleAppender()
            {
                Name = "ConsoleAppender",
                Layout = GetPatternLayout(),
                Threshold = Level.Error
            };
            consoleAppender.ActivateOptions();
            return consoleAppender;
        }
        private static FileAppender GetFileAppender()
        {
            var fileAppender = new FileAppender()
            {
                Name = "FileAppender",
                Layout = GetPatternLayout(),
                Threshold = Level.All,
                AppendToFile = false,
                File = @"C:\FileLogger.log"

            };
            fileAppender.ActivateOptions();
            return fileAppender;
        }
        private static RollingFileAppender GetRollingFileAppender()
        {
            var rollingFileAppender = new RollingFileAppender()
            {
                Name = "RollingFileAppender",
                Layout = GetPatternLayout(),
                Threshold = Level.All,
                AppendToFile = true,
                File = "RollingfileLogger.log",
                MaximumFileSize = "1MB",
                MaxSizeRollBackups = 15


            };
            rollingFileAppender.ActivateOptions();
            return rollingFileAppender;
        }

        public static ILog GetLogger([CallerFilePath]string filename = "")
        {

            if (_conAppender == null)
                _conAppender = GetConsoleAppender();
            if (_fileAppender == null)
                _fileAppender = GetFileAppender();
            if (_rollingFileAppender == null)
                _rollingFileAppender = GetRollingFileAppender();
            BasicConfigurator.Configure(_conAppender, _fileAppender, _rollingFileAppender);

            return LogManager.GetLogger(filename);

        }
    }

вместо файла FileLogger.log, я хочу, чтобы имя тестового примера использовалось для каждого запуска тестового примера. Я пока не могу найти какое-либо решение о том, как это сделать. Я попытался изменить значение переменной File в GetAppender (), но не смог. Также попытался передать имя файла параметра в тестовом примере, но файл все еще создается с именем FileLogger.

1 Ответ

1 голос
/ 22 апреля 2020

Это просто концепция использования TestName в качестве имени файла журнала, но вы получите представление.

using log4net;
using log4net.Appender;
using log4net.Config;
using log4net.Core;
using log4net.Layout;
using log4net.Repository.Hierarchy;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace UnitTest
{
    public static class Log4NetHelper
    {
        private static readonly string _layout = "%date{ABSOLUTE} [%class] [%level] [%method] - %message%newline";
        private static readonly string _appenderName = "FileAppender";

        private static PatternLayout GetPatternLayout()
        {
            PatternLayout patternLayout = new PatternLayout
            {
                ConversionPattern = _layout
            };

            patternLayout.ActivateOptions();

            return patternLayout;
        }

        private static FileAppender GetFileAppender(string fileName)
        {
            var fileAppender = new FileAppender
            {
                Name = _appenderName,
                Layout = GetPatternLayout(),
                Threshold = Level.All,
                AppendToFile = false,
                File = $@"C:\temp\{fileName}.log"
            };

            fileAppender.ActivateOptions();

            return fileAppender;
        }

        public static ILog GetLogger(string filename)
        {
            // Remember to clear old logger
            Logger root = ((Hierarchy)LogManager.GetRepository()).Root;
            root.RemoveAppender(_appenderName);

            BasicConfigurator.Configure(GetFileAppender(filename));

            return LogManager.GetLogger(filename);
        }
    }

    [TestClass]
    public class MyTestClass
    {
        public TestContext TestContext { get; set; }

        private ILog log;

        [TestInitialize]
        public void TestInitialize()
        {
            log = Log4NetHelper.GetLogger($"{TestContext.FullyQualifiedTestClassName}.{TestContext.TestName}");
        }

        [TestMethod]
        public void TestMethod1()
        {
            log.Info("This is my log message from TestMethod1");

            Assert.IsTrue(true);
        }

        [TestMethod]
        public void TestMethod2()
        {
            log.Info("This is my log message from TestMethod2");

            Assert.IsTrue(true);
        }
    }
}

Это создаст 2 файла в каталоге C: \ logs:

  • UnitTest.MyTestClass.TestMethod1.log
  • UnitTest.MyTestClass.TestMethod2.log

каждый с одним сообщением журнала.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...