NHibernate.Glimpse переопределяет log4net

Log4net произвел только пустой файл журнала. Сообщения NHibernate вообще не регистрировались. Мне было трудно понять, почему. Оказывается, теперь это вопрос NHibernate.Glimpse ...

Следующий параметр переопределяет поставщика журнала:

<add key="nhibernate-logger" 
     value="NHibernate.Glimpse.LoggerFactory, NHibernate.Glimpse"/>

Как только этот параметр присутствует, файл журнала (log4net) больше не получает сообщения NHibernate. Если его нет, Glimpse не будет по очереди показывать детали NHibernate.

Может ли кто-нибудь придумать способ, чтобы Glimpse отображал информацию NHibernate, продолжая вести журнал в соответствии с конфигурацией log4net?


person fan711    schedule 26.11.2013    source источник
comment
я думаю, что вы могли бы попробовать написать составной логгер, состоящий из Glimpse и log4net   -  person wiero    schedule 29.11.2013


Ответы (1)


Создайте фабрику составного регистратора и регистратор, как предлагает @wiero.

public class CombinedLoggerFactory : ILoggerFactory
{
    IList<ILoggerFactory> factories = new List<ILoggerFactory> {
        new Log4NetLoggerFactory(),
        new NHibernate.Glimpse.LoggerFactory()
    };

    public CombinedLoggerFactory()
    {
    }

    public IInternalLogger LoggerFor( Type type )
    {
        return new CombinedLogger( factories.Select( f => f.LoggerFor( type )));
    }

    public IInternalLogger LoggerFor( string keyName )
    {
        return new CombinedLogger( factories.Select( f => f.LoggerFor( keyName )));
    }
}

internal static class IEnumerableExtensions
{
    internal static void ForEach<T>( this IEnumerable<T> list, Action<T> action )
    {
        foreach( var x in list ) {
            action(x);
        }
    }
}

internal class CombinedLogger : IInternalLogger
{
    readonly IList<IInternalLogger> loggers;

    internal CombinedLogger( IEnumerable<IInternalLogger> logs )
    {
        loggers = logs.ToList();
    }

    public void Debug( object message, Exception exception )
    {
        loggers.Where( l => l.IsDebugEnabled )
            .ForEach( l => l.Debug( message, exception ));
    }

    public void Debug( object message )
    {
        loggers.Where( l => l.IsDebugEnabled )
            .ForEach( l => l.Debug( message ));
    }

    public void DebugFormat( string format, params object[] args )
    {
        loggers.ForEach( l => l.DebugFormat( format, args ));
    }

    public void Error( object message, Exception exception )
    {
        loggers.Where( l => l.IsErrorEnabled )
            .ForEach( l => l.Error( message, exception ));
    }

    public void Error( object message )
    {
        loggers.Where( l => l.IsErrorEnabled )
            .ForEach( l => l.Error( message ));
    }

    public void ErrorFormat( string format, params object[] args )
    {
        loggers.ForEach( l => l.ErrorFormat( format, args ));
    }

    public void Fatal( object message, Exception exception )
    {
        loggers.Where( l => l.IsFatalEnabled )
            .ForEach( l => l.Fatal( message, exception ));
    }

    public void Fatal( object message )
    {
        loggers.Where( l => l.IsFatalEnabled )
            .ForEach( l => l.Fatal( message ));
    }

    public void Info( object message, Exception exception )
    {
        loggers.Where( l => l.IsInfoEnabled )
            .ForEach( l => l.Info( message, exception ));
    }

    public void Info( object message )
    {
        loggers.Where( l => l.IsInfoEnabled )
            .ForEach( l => l.Info( message ));
    }

    public void InfoFormat( string format, params object[] args )
    {
        loggers.ForEach( l => l.InfoFormat( format, args ));
    }

    public bool IsDebugEnabled
    {
        get { return loggers.Any( l => l.IsDebugEnabled ); }
    }

    public bool IsErrorEnabled
    {
        get { return loggers.Any( l => l.IsErrorEnabled ); }
    }

    public bool IsFatalEnabled
    {
        get { return loggers.Any( l => l.IsFatalEnabled ); }
    }

    public bool IsInfoEnabled
    {
        get { return loggers.Any( l => l.IsInfoEnabled ); }
    }

    public bool IsWarnEnabled
    {
        get { return loggers.Any( l => l.IsWarnEnabled ); }
    }

    public void Warn( object message, Exception exception )
    {
        loggers.Where( l => l.IsWarnEnabled )
            .ForEach( l => l.Warn( message, exception ));
    }

    public void Warn( object message )
    {
        loggers.Where( l => l.IsWarnEnabled )
            .ForEach( l => l.Warn( message ));
    }

    public void WarnFormat( string format, params object[] args )
    {
        loggers.ForEach( l => l.WarnFormat( format, args ));
    }
}
person Lachlan Roche    schedule 29.11.2013