c# - 使用 log4net 包

标签 c# log4net

我最近将 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 而无需在每个类的顶部定义它吗?

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

    Log.Debug(IP,"这是 DEBUG 级别的消息。通常是您最详细的级别。");

日志文件是这样显示的:

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>

这一切都取决于你的幻想。

关于c# - 使用 log4net 包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30858508/

相关文章:

c# - 如何在 C# 中将语法(规则)和听写(自由言论)与 SpeechRecognizer 混合使用

c# - 来自类之间递归依赖的 System.StackOverflow 异常

c# - IIS ASP.net 应用程序突然挂起请求

c# - log4net-RollingFileAppender-XmlLayoutSchemaLog4j 未登录 .Net Core 3

.net-4.0 - 运行以 Release模式构建的.Net 4.0 Windows应用程序时,log4net不会记录日志

c# - log4net C# 中的方法名称

c# - 使用 Json.Net 反序列化时出现错误 "Cannot deserialize the current JSON array"

c# - 为定界符创建转义序列的严格方法

c# - 如何使用 log4net 在日志文件中添加一个空行?

c# - 如何在代码中而不是在 xml 文件中使用 log4net 配置 NHibernate 日志记录?