使用 log4net 包

working with log4net package

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

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

  2. 当我添加 log4net 包时,一个 packages.config 文件已添加到我的项目中,内容如下:

    <?xml version="1.0" encoding="utf-8"?>
    <packages>
      <package id="log4net" version="2.0.3" targetFramework="net45" />
    </packages>
    

这是什么?我可以删除它吗?

  1. 我可以在整个项目中使用 log4net 而无需在每个项目顶部定义它吗 class?

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

    Log.Debug(IP,"This is a DEBUG level message. Typically your most VERBOSE level.");

日志文件显示如下:

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. 我还在 conversionPattern 中添加了 %line,但它不起作用。每次都从72开始,请问如何解决?

  2. 如何在wcf应用程序中记录应用程序的停止和启动?

你实际上在 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>

一切随心所欲