[英]Is there anything I should worry about when using nullable types in .Net 2.0?
[英]log4net: Creating a logger dynamically, should I worry about anything?
我需要動態創建記錄器,所以通過這里的帖子和反射器的幫助,我已經設法動態創建記錄器,但我想知道我是否應該擔心其他事情......我不知道有哪些影響可以做到。
public static ILog GetDyamicLogger(Guid applicationId)
{
Hierarchy hierarchy = (Hierarchy)LogManager.GetRepository();
RollingFileAppender roller = new RollingFileAppender();
roller.LockingModel = new log4net.Appender.FileAppender.MinimalLock();
roller.AppendToFile = true;
roller.RollingStyle = RollingFileAppender.RollingMode.Composite;
roller.MaxSizeRollBackups = 14;
roller.MaximumFileSize = "15000KB";
roller.DatePattern = "yyyyMMdd";
roller.Layout = new log4net.Layout.PatternLayout();
roller.File = "App_Data\\Logs\\"+applicationId.ToString()+"\\debug.log";
roller.StaticLogFileName = true;
PatternLayout patternLayout = new PatternLayout();
patternLayout.ConversionPattern = "%date [%thread] %-5level %logger [%property{NDC}] - %message%newline";
patternLayout.ActivateOptions();
roller.Layout = patternLayout;
roller.ActivateOptions();
// this will add this appender to all logger created by LogManager.GetLogger(...)
//hierarchy.Root.AddAppender(roller);
// this will change all Loggers level to Level.All
//hierarchy.Root.Level = Level.All;
hierarchy.Configured = true;
DummyLogger dummyILogger = new DummyLogger(applicationId.ToString());
dummyILogger.Hierarchy = hierarchy;
dummyILogger.Level = log4net.Core.Level.All;
dummyILogger.AddAppender(roller);
return new LogImpl(dummyILogger);
}
internal sealed class DummyLogger : Logger
{
// Methods
internal DummyLogger(string name)
: base(name)
{
}
}
我會說您不必擔心在代碼中創建記錄器。 這是創建它們的受支持方法之一。 您確實無法在應用程序運行時更改內容(除非您為其編寫代碼)。 這只是使用配置文件的好處之一。
我注意到的一件事是,以這種方式創建的記錄器沒有“正確”地輸入到日志層次結構中( LogManager.GetLogger
不會返回它)。 但是,如果不是dummyILogger.Hierarchy = hierarchy;
,我因此使用了hierarchy.GetLogger(string ILoggerFactory)
,它解決了這個問題:
//End of the GetDyamicLogger function
hierarchy.GetLogger(loggerName, new DynamicLoggerFactory(loggerName, dummyILogger));
return new LogImpl(dummyILogger);
}
/// <summary>
/// Dummy <c>ILoggerFactory</c> implementation used by <c>Hierarchy.GetLogger</c>.
/// </summary>
internal sealed class DynamicLoggerFactory : ILoggerFactory
{
private readonly string name;
private readonly Logger logger;
public DynamicLoggerFactory(string name, Logger logger) { this.name=name; this.logger=logger; }
public Logger CreateLogger(log4net.Repository.ILoggerRepository repository, string name)
{
if(name != this.name) { throw new ArgumentOutOfRangeException("name", name, "Unexpected logger name queried."); }
return this.logger;
}
}
這樣, LogManager.GetLogger
將返回動態創建的記錄器。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.