使用相同的log4net实例登录所有项目

时间:2017-11-27 09:14:11

标签: c# log4net

我在c#解决方案中使用Log4net,它在一个解决方案中包含3个项目。 我想使用此记录器的相同实例登录到一个文件。 这是App.Config

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,Log4net"/>
  </configSections>

  <log4net>
    <appender name="TestAppender" type="log4net.Appender.RollingFileAppender" >
      <file value="C:\log\MyTestAppender.log" />
      <!--<file value="../../test/MyTestAppender.log" />-->
      <encoding value="utf-8" />
      <appendToFile value="true" />
      <rollingStyle value="Date" />
      <!--<rollingStyle value="Size" />
      <maxSizeRollBackups value="5" />
      <maximumFileSize value="5MB" />
      <staticLogFileName value="true" />-->
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date %level  %type.%method - %message%n" />
      </layout>
    </appender>
    <root>
      <level value="All" />
      <!-- If the following line is not included the log file will not be created even if log4net is configured with this file. -->
      <appender-ref ref="TestAppender" />
    </root>
  </log4net>


</configuration>

我这样做是为了记录

private static readonly ILog log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

我应该在哪里放置这些信息,以便从所有项目登录相同的日志文件。 非常感谢

3 个答案:

答案 0 :(得分:1)

您应该在静态构造函数中加载配置文件。

喜欢这个

    static LogHelper()
    {
        log4net.Config.XmlConfigurator.ConfigureAndWatch(
            new System.IO.FileInfo(@"AppConfig\log4net.config"));
    }

配置文件应该是这样的:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <!-- Register log4net -->
    <configSections>
        <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
    </configSections>
    <log4net>
        <!--log configs -->
    </log4net>
</configuration>

答案 1 :(得分:0)

你可以这样做,我的意思是说在静态类上创建并创建日志实例,并在该静态类上调用log方法,它只使用一个日志实例。

public static class Utility
    {
        private static ILog log = LogManager.GetLogger("CommonLogger");
        public static void LogMessage(string message)
        {
            Task.Factory.StartNew(() => log.Info(message));
        }
}

或者你也可以使用Singleton模式来实现这个

public Class LogSingleTon
{

    private static readonly Lazy<LogSingleTon> lazy =
        new Lazy<LogSingleTon>(() => new LogSingleTon());

    public static LogSingleTon Instance { get { return lazy.Value; } }
    private ILog log ;
    private LogSingleTon()
    {
        log = LogManager.GetLogger("CommonLogger")
    }
    public void LogMessage(string message)
    {
        Task.Factory.StartNew(() => log.Info(message));
    }      

}

答案 2 :(得分:0)

我认为您使用依赖注入框架,您还可以将Log4net记录器注册为(一个)实例,并将其注入您想要使用它的任何位置。

E.g。使用Autofac:

var builder = new ContainerBuilder();

// Log4net
var logger = LogManager.GetLogger("[Whatever name your would like to use for your logger]");
builder.RegisterInstance(logger);