简体   繁体   中英

How to give testcase name to log4net log file for every separate test case

I tried implementing log4net for my automation framework. I have not written the XML config file. I have used code file only for configuring it.

 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);

        }
    }

instead of the FileLogger.log file, I want the name of the test case for every test case run. I am not able to come up with any solution yet on how to do this. I tried changing the File variable value in GetAppender() but couldn't do. Also tried passing the parameter filename in test case but still the file is created by the name of FileLogger.

This is just a concept how to use TestName as a log file name, but you will get an idea.

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);
        }
    }
}

This will generate 2 files in C:\logs directory:

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

each with one single log message.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM