我最近将 log4net 包添加到我的 WCF Web 应用程序中。现在我有几个问题:
我通过 VS 2013 包安装添加了 log4net 包,并且 它添加了整个包。我的猜测是 log4net 只是 dll,我可以通过添加 dll 将它添加到我的项目中吗?
当我添加 log4net 包时,一个 packages.config 文件已添加到我的项目中,其内容如下:
<?xml version="1.0" encoding="utf-8"?> <packages> <package id="log4net" version="2.0.3" targetFramework="net45" /> </packages>
这是什么?我可以删除它吗?
我可以在整个项目中使用 log4net 而无需在每个类的顶部定义它吗?
我想在消息部分添加一个额外的字段。例如我想记录这样的事件:
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.
我还在 conversionPattern 中添加了
%line
但它不起作用。每次都是从72开始,这个怎么解决?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/