c# - 用于 log4net 的 CaSTLe 日志记录工具,具有流畅的 log4net 配置

标签 c# log4net castle-windsor castle

我有一个流畅的 log4net 配置。它位于一个名为 log4netConfigSetup.cs 的类中。在我的 CaSTLe 安装程序类中,当您添加如下所示的日志记录工具时,它会在 app.config 中搜索配置:

public void Install(IWindsorContainer container, IConfigurationStore store)
{
    container.AddFacility<LoggingFacility>(f => f.UseLog4Net());
} 

如何让它寻找我拥有的流畅配置类,而不是 log4net 配置的配置文件或 xml 文件?

最佳答案

您可以通过实现 ILoggerFactory 来做到这一点,就像这个部分示例:您需要实现要使用的 ILogger 接口(interface)的所有部分。

using System;
using Castle.Core.Logging;
using Castle.Facilities.Logging;
using Castle.MicroKernel.Registration;
using Castle.MicroKernel.SubSystems.Configuration;
using Castle.Windsor;
using log4net;

namespace Castle_Log4Net
{
    public class Installer : IWindsorInstaller
    {
        public void Install(IWindsorContainer container, 
                            IConfigurationStore store)
        {
            container.AddFacility<LoggingFacility>
                    (f => f.LogUsing<Log4NetLoggingFactory>());
        }
    }

    public class Log4NetLoggingFactory : Castle.Core.Logging.ILoggerFactory
    {
        static Log4NetLoggingFactory()
        {
            // here you configure log4net from log4netConfigSetup.cs
        }

        public ILogger Create(Type type)
        {
            return new Log4NetLogger(type);
        }

        public ILogger Create(string name)
        {
            return new Log4NetLogger(name);
        }

        public ILogger Create(Type type, LoggerLevel level)
        {
            throw new NotImplementedException();
        }

        public ILogger Create(string name, LoggerLevel level)
        {
            throw new NotImplementedException();
        }
    }

    public class Log4NetLogger : Castle.Core.Logging.ILogger
    {
        private readonly ILog logger;

        public Log4NetLogger(Type type)
        {
            this.logger = LogManager.GetLogger(type);
        }

        public Log4NetLogger(string name)
        {
            this.logger = LogManager.GetLogger(name);
        }

        public ILogger CreateChildLogger(string loggerName)
        {
            throw new NotImplementedException();
        }

        public void Debug(string message)
        {
            logger.Debug(message);
        }

        public void Debug(Func<string> messageFactory)
        {
            logger.Debug(messageFactory.Invoke());
        }

        public void Debug(string message, Exception exception)
        {
            logger.Debug(message, exception);
        }

        public void DebugFormat(string format, params object[] args)
        {
            throw new NotImplementedException();
        }

        public void DebugFormat(Exception exception, string format, params object[] args)
        {
            throw new NotImplementedException();
        }

        public void DebugFormat(IFormatProvider formatProvider, string format, params object[] args)
        {
            throw new NotImplementedException();
        }

        public void DebugFormat(Exception exception, IFormatProvider formatProvider, string format, params object[] args)
        {
            throw new NotImplementedException();
        }

        public void Error(string message)
        {
            throw new NotImplementedException();
        }

        public void Error(Func<string> messageFactory)
        {
            throw new NotImplementedException();
        }

        public void Error(string message, Exception exception)
        {
            throw new NotImplementedException();
        }

        public void ErrorFormat(string format, params object[] args)
        {
            throw new NotImplementedException();
        }

        public void ErrorFormat(Exception exception, string format, params object[] args)
        {
            throw new NotImplementedException();
        }

        public void ErrorFormat(IFormatProvider formatProvider, string format, params object[] args)
        {
            throw new NotImplementedException();
        }

        public void ErrorFormat(Exception exception, IFormatProvider formatProvider, string format, params object[] args)
        {
            throw new NotImplementedException();
        }

        public void Fatal(string message)
        {
            throw new NotImplementedException();
        }

        public void Fatal(Func<string> messageFactory)
        {
            throw new NotImplementedException();
        }

        public void Fatal(string message, Exception exception)
        {
            throw new NotImplementedException();
        }

        public void FatalFormat(string format, params object[] args)
        {
            throw new NotImplementedException();
        }

        public void FatalFormat(Exception exception, string format, params object[] args)
        {
            throw new NotImplementedException();
        }

        public void FatalFormat(IFormatProvider formatProvider, string format, params object[] args)
        {
            throw new NotImplementedException();
        }

        public void FatalFormat(Exception exception, IFormatProvider formatProvider, string format, params object[] args)
        {
            throw new NotImplementedException();
        }

        public void Info(string message)
        {
            throw new NotImplementedException();
        }

        public void Info(Func<string> messageFactory)
        {
            throw new NotImplementedException();
        }

        public void Info(string message, Exception exception)
        {
            throw new NotImplementedException();
        }

        public void InfoFormat(string format, params object[] args)
        {
            throw new NotImplementedException();
        }

        public void InfoFormat(Exception exception, string format, params object[] args)
        {
            throw new NotImplementedException();
        }

        public void InfoFormat(IFormatProvider formatProvider, string format, params object[] args)
        {
            throw new NotImplementedException();
        }

        public void InfoFormat(Exception exception, IFormatProvider formatProvider, string format, params object[] args)
        {
            throw new NotImplementedException();
        }

        public void Warn(string message)
        {
            throw new NotImplementedException();
        }

        public void Warn(Func<string> messageFactory)
        {
            throw new NotImplementedException();
        }

        public void Warn(string message, Exception exception)
        {
            throw new NotImplementedException();
        }

        public void WarnFormat(string format, params object[] args)
        {
            throw new NotImplementedException();
        }

        public void WarnFormat(Exception exception, string format, params object[] args)
        {
            throw new NotImplementedException();
        }

        public void WarnFormat(IFormatProvider formatProvider, string format, params object[] args)
        {
            throw new NotImplementedException();
        }

        public void WarnFormat(Exception exception, IFormatProvider formatProvider, string format, params object[] args)
        {
            throw new NotImplementedException();
        }

        public bool IsDebugEnabled { get; private set; }
        public bool IsErrorEnabled { get; private set; }
        public bool IsFatalEnabled { get; private set; }
        public bool IsInfoEnabled { get; private set; }
        public bool IsWarnEnabled { get; private set; }
    }
}

关于c# - 用于 log4net 的 CaSTLe 日志记录工具,具有流畅的 log4net 配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23937314/

相关文章:

c# - 如何将浮点值从 MySQL 数据库获取到数据表中 | C#

c# - 为什么使用动态参数调用通用本地函数会产生 BadImageFormatException?

c# - ASP.net 中的静态文件和身份验证

c# - 使用 CaSTLe Windsor 在 WebAPI 中进行依赖注入(inject)

caSTLe-windsor - 在为下游依赖项提供值的同时解决依赖项

c# - 新手 caSTLe windsor 并尝试创建我的接口(interface)的实现

c# - 将数值的 IEnumerable 作为参数传递给方法

c# - 如何以编程方式更改文件位置?

log4net - 如何使 log4net.Filter.StringMatchFilter 与 acceptOnMatch 设置为 false 一起工作

multithreading - Log4Net FileAppender 不是线程安全的?