使用log4net包

时间:2015-06-16 03:56:08

标签: c# log4net

我最近将log4net包添加到了我的WCF Web应用程序中。现在我几乎没有问题:

  1. 我通过VS 2013软件包安装添加了log4net软件包 它添加了整个包。我的猜测是log4net只是dll,我可以通过添加dll将它添加到我的项目中吗?

  2. 当我添加log4net包时,package.config文件已添加到我的项目中,并带有以下内容:

    <?xml version="1.0" encoding="utf-8"?>
    <packages>
      <package id="log4net" version="2.0.3" targetFramework="net45" />
    </packages>
    
  3. 这是什么?我可以删除吗?

    1. 我是否可以在我的项目中使用log4net,而无需在每个类的顶部定义它?

    2. 我想在消息部分添加一个额外的字段。例如,我想记录这样的事件:

      Log.Debug(IP,&#34;这是一个DEBUG级别的消息。通常是你的VERBOSE级别。&#34;);

    3. 并且日志文件显示如下:

      72 DEBUG 2015-06-16 08:17:41,713 [10] [(null)] [InsertDate] - from source IP(192.168.1.1) This is a DEBUG level message.  Typically your most VERBOSE level.
      
      1. 我还将%line添加到conversionPattern中,但它不起作用。每次从72开始。如何解决这个问题?

      2. 如何在wcf应用程序中停止并启动应用程序?

1 个答案:

答案 0 :(得分:5)

你实际上在1中提出了4个问题。 首先,您需要了解您已经使用了NuGet包管理器,并且最好使用NuGet包含可用包但不能手动包装,因为它会自动将包放在适当的位置,让您可以轻松地将此包添加到其他解决方案项目中,提供版本控制等。 了解更多关于NuGet的信息。例如,here

现在关于你的问题:

首先:不,log4net包不仅包含log4net.dll文件。它还有log4net.xml个文件。是的,您可以手动添加这两个文件,而无需使用NuGet包管理器。

第二:它是项目中NuGet包的列表。如果您不打算使用NuGet,则只能将其删除。但是,这不是一个好主意 - 让它存在,它是一个轻量级的XML文件。

第三:这是OOP的问题。创建单例全局记录器,例如:

public static class LoggingFactory
{
    private static ILog _logger;

    private static ILog CreateLogger()
    {
        // Some log4net initialization
        return LogManager.GetLogger("Logger");
    }

    public static ILog GetLogger()
    {
        return _logger ?? (_logger = CreateLogger());
    }
}

public class AnyClassOfYourWholeSolution
{
    LoggingFactory.GetLogger().DebugFormat("{0} {1}", a, b);
}

第四:这是OOP的问题。创建一个适配器并使用它:

public interface ILogger
{
    void Debug(string ip, string message);
    void Info(string ip, string message);
    void Error(string ip, string message);
}

public class Log4NetLogger : ILogger
{
    private ILog  _logger;

    public Log4NetLogger() 
    {
        // Some log4net initialization
        _logger = LogManager.GetLogger("Logger");
    }

    public void Debug(string ip, string message)
    {
        // ...
    }

    public void Info(string ip, string message)
    {
        // ...
    }

    public void Error(string ip, string message)
    {
        // ...
    }
}

public static class LoggingFactory
{
    private static ILogger _loggerAdapter;

    private static Initialize(ILogger adapter)
    {
        _loggerAdapter = adapter;
    }

    public static GetLogger()
    {
        return _logger;
    }
}

public class BeginningOfYourProject 
{
    // Main() or Global.asax or Program.cs etc.
    LoggingFactory.Initialize(new Log4NetLogger());
}

public class AnyClassOfYourWholeProject
{
    LoggingFactory.GetLogger().Debug(ip, message);
}

或者您可以将ip提取到log4net的属性:

// During initialization
log4net.ThreadContext.Properties["ip"] = ip;

// log4net Config
<layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%n%-5p %d %t IP: %property{ip} %m" />
</layout>

这完全取决于你的幻想。