Use log4net in SDK
我正在提供使用C#的SDK。要启用现场调试,我想包括使用log4net进行日志记录。由于程序集将是dll,如何在不使用App.config的情况下启用配置?
谢谢,
考虑使用XmlConfigurator为log4net配置独立的配置文件位置。您可以使用此技术提供独立的基于文件的配置,而无需触摸app \\\\ web.config或对其进行硬编码。示例:
http://haacked.com/archive/2005/03/07/ConfiguringLog4NetForWebApplications.aspx
更新
尝试使用以下引导程序来配置独立配置文件。它将构建一条完整的路径。如果仍然找不到该路径,请尝试注销该路径。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| public static class LogFactory
{
public const string ConfigFileName ="log4net.config";
public static void Configure ()
{
Type type = typeof(LogFactory );
FileInfo assemblyDirectory = AssemblyInfo .GetCodeBaseDirectory(type );
string path = Path .Combine(assemblyDirectory .FullName, ConfigFileName );
FileInfo configFile = new FileInfo (path );
XmlConfigurator .ConfigureAndWatch(configFile );
log4net .ILog log = LogManager .GetLogger(type );
log .ToString();
}
} |
致电:
- 我正在尝试该建议,但未记录任何内容。因此,我进入了源代码。原因如下:
-
我正在尝试使用上面链接中的确切步骤的建议,但未记录任何内容。因此,我进入了源代码。原因如下:configElement = System.Configuration.ConfigurationSettings.GetConfig(" log4n ?? et")as XmlElement;配置功能仍在我没有的应用程序配置文件中寻找" log4net"部分。有什么想法为什么不选择我自己的单独的log4net.config文件?谢谢。
-
是的。我认为我应该能够通过调用log4net.Config.XmlConfigurator.Configure(new FileInfo(" log4net.config"))来指定我的配置文件。但是目前VS buildin单元测试框架尚未选择此文件。
-
@Icerman我在回答中添加了一个配置例程,该例程将为配置文件构建完整路径。
-
伟大的!我得到了通过在单元测试属性中添加log4net.config作为部署的一部分而创建的日志文件。在运行测试后,日志文件仍然以某种方式仍然为空。这是配置文件(因为它很大,所以另作注释)。
-
<log4net> <logger name =" MySDK"> <level value =" INFO" /> </ logger> <file value =" C:\\\\ Temp \\\\ MyLog.txt" /> <rollingStyle value =" Size" / > <maxSizeRollBackups值=" 50" /> <maximumFileSize值=" 1MB" /> <布局类型=" log4net.Layout.PatternLayout"> <conversionPattern值="。te [%thread]%-5level:-%message% newline" /> </ layout> </ appender> </ log4net>
-
@Icerman尽管没有xml声明,但配置看起来不错。那么状态是什么-现在可以找到配置文件吗?路径正确吗?
-
是的,由于大小原因,我跳过了前两行:<?xml version =" 1.0" encoding =" utf-8"?> <configuration>路径正确,找到了文件,并创建了MyLog.txt。但是,在我调用Logger.Info(" Debug info")之后,没有任何内容记录到日志中。
-
<log4net> \\ t \\ t \\ t <文件值=" C:\\\\ Temp \\\\ MyLog.txt" /> \\ t \\ t \\ t \\ t <rollingStyle value =" Size" /> \\ t \\ t <maxSizeRollBackups value =" 50" /> \\ t \\ t <maximumFileSize value =" 1MB" /> \\ t \\ t <layout type =" log4net.Layout.PatternLayout"> \\ t \\ t \\ t <conversionPattern value ="。te [ %thread]%-5level:-%message%newline" /> \\ t \\ t </ layout> \\ t </ appender> \\ t \\ t <root> <level value =" INFO" /> </ root> < / log4net>
-
@chibacity根元素有所作为。有效!非常感谢你的帮助!!!
-
@Icerman这就是我所怀疑的。您使用的是命名记录器,但未登录。我将其替换为常规配置。呀!乐意效劳。我赢得了那个代表! :)
您可以将配置放入代码中,尽管不建议这样做。
最好将dll与外部文件一起发送,或者添加一个代码-如果该文件存在,则要使用它,否则,请使用硬编码配置。
您还可以考虑将Common.Logging用于.Net抽象。
http://netcommon.sourceforge.net/
Common.Logging开箱即用地支持log4net,NLog和Enterprise Library。如果需要,编写自己的适配器与Common.Logging一起使用很容易。
这样,您的SDK就可以与日志记录平台无关。您的用户仍需要在app.config或web.config中输入一个条目来指示要使用的平台,但是特定于平台的配置仍可以存储在单独的文件中。
为什么不通过提供记录器的抽象来使您的SDK日志平台不可知? Caliburn.Micro做到了这一点,本文介绍了它的工作方式以及客户端如何配置他们希望使用的适当记录器-http://buksbaum.us/2010/08/08/how-to-do-logging-with -caliburn-micro /