Search code examples
log4netconfigure

Can't configure log4net Logger programmatically


I need to configure a log4net Logger programmatically. Specifically, I need to add a Logger with one appender. However, when I retrieve it, I find that it doesn't have the correct level or appender, and was hoping I was missing some simple configuration ceremony:

        var patternLayout = new PatternLayout { ConversionPattern = "%message%newline" };
        patternLayout.ActivateOptions();

        var hierarchy = (Hierarchy)LogManager.GetRepository();

        var testAppender = new RollingFileAppender
        {
            Name = "test-appender",
            AppendToFile = true,
            File = "c:\\temp\\test.log",
            Layout = patternLayout,
            DatePattern = "yyyyMMdd-HHmm",
            MaxSizeRollBackups = 50,
            MaximumFileSize = "20MB",
            RollingStyle = RollingFileAppender.RollingMode.Size,
            StaticLogFileName = false,
            Encoding = Encoding.UTF8,
            PreserveLogFileNameExtension = true,
            Threshold = Level.Debug
        };

        testAppender.ActivateOptions();

        var testLogger = hierarchy.LoggerFactory.CreateLogger(hierarchy, "test");
        testLogger.Hierarchy = hierarchy;
        testLogger.AddAppender(testAppender);
        testLogger.Repository.Configured = true;
        testLogger.Level = Level.Debug;
        testLogger.Additivity = false;

        hierarchy.Configured = true;

        var testLogger = LogManager.GetLogger("test");

The logger 'testLogger' has a null Level and no appenders. What am I missing?


Solution

  • Instead of calling

    var testLogger = hierarchy.LoggerFactory.CreateLogger(hierarchy, "test");
    

    I called

    var testLogger = hierarchy.GetLogger("test", hierarchy.LoggerFactory);
    

    And that worked. GetLogger will create the logger if it does not already exist.