JSP.NET
JSP.NET

Reputation: 188

log4Net - logger only using root appender, not other appender

<log4net>
    <logger name="LogManager2" additivity="false">
        <level value="ALL"/>
        <appender-ref ref="LogManager2" />
    </logger>
    <root>
        <level value="ALL"/>
        <appender-ref ref="LogManager1" />
    </root>
    <appender name="LogManager1" type="log4net.Appender.RollingFileAppender">
        <file value="logs\log" />
        <appendToFile value="true" />
        <rollingStyle value="Composite" />
        <datePattern value="_yyyy-MM-dd" />
        <maxSizeRollBackups value="10" />
        <maximumFileSize value="10MB" />
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%date %-5level - %message%newline" />
        </layout>
    </appender>
    <appender name="LogManager2" type="log4net.Appender.RollingFileAppender">
        <file value="logs\Logs2" />
        <appendToFile value="true" />
        <rollingStyle value="Composite" />
        <datePattern value="_yyyy-MM-dd" />
        <maxSizeRollBackups value="10" />
        <maximumFileSize value="10MB" />
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%date %-5level - %message%newline" />
        </layout>
    </appender>
</log4net>

when I am trying to use logger for logmanager2,

ILog Logger = LogManager.GetLogger(typeof(LogManager2));

it is supposed to write log to logs2 file but logger is using root log file and logging data to logs file.I have tried all answers available regarding this topic,but nothing worked for me can anyone explain me the problem?

Upvotes: 0

Views: 2168

Answers (2)

Alex Strickland
Alex Strickland

Reputation: 1614

I battled with this and I don't like the XML config so this is what I wrote (works from multiple different DLL's and creates a different log for each):

using System;
using System.Reflection;

using log4net;
using log4net.Repository.Hierarchy;
using log4net.Core;
using log4net.Appender;
using log4net.Layout;

// ReSharper disable once CheckNamespace
namespace EasiPos.EasiLog
{
    public class Log
    {
        private static ILog _log;
        public static void Initialise(string logName, string logFile)
        {
            var hierarchy = (Hierarchy)LogManager.CreateRepository(logName);

            var patternLayout = new PatternLayout {ConversionPattern = "%date %-5level - %message%newline%exception"};
            patternLayout.ActivateOptions();

            var rollingFileAppender = new RollingFileAppender
            {
                AppendToFile = true,
                Name = logName,
                File = logFile,
                Layout = patternLayout,
                MaxSizeRollBackups = 10,
                RollingStyle = RollingFileAppender.RollingMode.Date,
                StaticLogFileName = true
            };
            rollingFileAppender.ActivateOptions();

            hierarchy.Root.AddAppender(rollingFileAppender);
            hierarchy.Root.Level = Level.All;
            hierarchy.Configured = true;

            _log = LogManager.GetLogger(logName, logName);

        }

        public static void Info(string message)
        {
            _log.Info(message);
        }

        public static void Debug(string message)
        {
            _log.Debug(message);
        }

        public static void Error(string message)
        {
            _log.Error(message);
        }

        public static void Error(Exception exception)
        {
            _log.Error(exception.Message, exception);
        }

        public static void Error(string message, Exception exception)
        {
            _log.Error(message, exception);
        }
    }
}

Initialise it like this:

using static EasiPos.EasiLog.Log;

Initialise("EasiKDS", @"TRACE\EasiKDS.exe.log");

Upvotes: 0

Alberto Chiesa
Alberto Chiesa

Reputation: 7360

When you require a Logger, you can pass a type or a string.

When you pass a type, Log4net searches for a logger with a name equal to the name of the class, including the namespace.

So, you should either call:

ILog Logger = LogManager.GetLogger("LogManager2");

or rename the logger as YourNamespace.LogManager2. As this:

<logger name="LogManagerNamespace.LogManager2" additivity="false">

Upvotes: 1

Related Questions