log4Net - регистратор, использующий только корневой модуль, а не другой модуль

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

когда я пытаюсь использовать регистратор для logmanager2,

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

предполагается, что журнал записывается в файл logs2, но регистратор использует корневой файл журнала и записывает данные в файл журнала. Я перепробовал все доступные ответы по этой теме, но у меня ничего не получилось, может ли кто-нибудь объяснить мне проблему?


person JSP.NET    schedule 16.03.2016    source источник
comment
как вы разрешаете регистратор LogManager2? Я имею в виду точный код, регистр и все такое.   -  person A. Chiesa    schedule 16.03.2016
comment
Я отредактировал код. @А.Кьеза   -  person JSP.NET    schedule 16.03.2016


Ответы (2)


Когда вам требуется Logger, вы можете передать тип или строку.

Когда вы передаете тип, Log4net ищет логгер с именем, равным имени класса, включая пространство имен.

Итак, вы должны либо позвонить:

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

или переименуйте регистратор как YourNamespace.LogManager2. Как это:

<logger name="LogManagerNamespace.LogManager2" additivity="false">
person A. Chiesa    schedule 16.03.2016
comment
у меня не сработало .. :( У меня есть две службы, и я хочу регистрировать информацию о двух службах в отдельных файлах. Вот почему я добавил два приложения, но журнал регистрируется только в файле корневого приложения. - person JSP.NET; 16.03.2016
comment
Я не слежу за тобой. У вас есть две услуги. И это нормально. У вас есть два регистратора с двумя разными приложениями, и это нормально. Все происходит в корне, потому что вы вызываете GetLogger, не можете разрешить регистратор для вашего типа LogManager2. Вы должны переименовать регистратор или вызвать GetLogger со строкой. Я почти уверен, что это твоя проблема. - person A. Chiesa; 16.03.2016

Я боролся с этим, и мне не нравится конфигурация XML, поэтому я написал это (работает из нескольких разных DLL и создает для каждого отдельный журнал):

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

Инициализируйте его так:

using static EasiPos.EasiLog.Log;

Initialise("EasiKDS", @"TRACE\EasiKDS.exe.log");
person Alex Strickland    schedule 16.03.2016