使用Ninject将Log4Net注入控制台应用程序

本文关键字:控制台 应用程序 注入 Log4Net Ninject 使用 | 更新日期: 2023-09-27 18:05:49

是否有文章或完整的示例展示如何使用ninject将Log4Net记录器注入控制台应用程序?到目前为止,我已经设法在主模块中创建了一个新的实例,但我无法弄清楚如何注入。下面是我的设置。

编辑:我想我也应该加上这样做的原因。我想把记录器注入到其他类中来做日志记录。

using System;
using System.Reflection;
using Ninject;
using Ninject.Modules;
namespace SomeNameSpace
{
    public class MyProgram
    {
        public static void Main(string[] args)
        {
            log4net.Config.BasicConfigurator.Configure();
            log4net.ILog log = log4net.LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
            try
            {
                log.Info("Application - Start");
                Initialiase();
                _something.DoSomething();
                log.Info("Application - End");
            }
            catch (Exception ex)
            {
                log.Error("Application failed", ex);
            }
        }
        private static void Initialiase()
        {
            var kernel = new StandardKernel();
            kernel.Load(Assembly.GetExecutingAssembly());
            _something = kernel.Get<ISomething>();
        }
    }
    public class Bindings : NinjectModule
    {
        public override void Load()
        {
            Bind<ISomething>().To<Something>();
        }
    }
}

使用Ninject将Log4Net注入控制台应用程序

我是这样做到的…

using System;
using System.Reflection;
using Ninject;
using log4net;
namespace SomeNameSpace
{
    public class MyProgram
    {
        private static ILog _log;
        public static void Main(string[] args)
        {
            try
            {
                Initialiase();
                _log.Info("Application - Start");
                _something.DoSomething();
                _log.Info("Application - End");
            }
            catch (Exception ex)
            {
                _log.Error("Application failed", ex);
            }
        }
        private static void Initialiase()
        {
            var kernel = new StandardKernel();
            kernel.Load(Assembly.GetExecutingAssembly());
            _log = kernel.Get<ILog>();
            _something = kernel.Get<ISomething>();
        }
    }
    public class Bindings : NinjectModule
    {
        public override void Load()
        {
            Bind<ILog>().ToMethod(c => LogManager.GetLogger(typeof(Program))).InSingletonScope();
            Bind<ISomething>().To<Something>();
        }
    }
}

现在我可以DI ILog并开始记录。

但是,记录器现在总是以somenamspace . program命名。这将使识别从应用程序中的哪个位置写入日志变得困难。我能找到的最简单的解决方案是更改Log4Net配置并使用%C代替%logger。