C# log4net:动态创建一个记录器,我应该担心什么吗?
我需要动态创建记录器,所以在一篇帖子和reflector的帮助下,我成功地动态创建记录器,但我想知道我是否应该担心其他事情。。。我不知道这会有什么影响C# log4net:动态创建一个记录器,我应该担心什么吗?,c#,.net,logging,log4net,C#,.net,Logging,Log4net,我需要动态创建记录器,所以在一篇帖子和reflector的帮助下,我成功地动态创建记录器,但我想知道我是否应该担心其他事情。。。我不知道这会有什么影响 public static ILog GetDyamicLogger(Guid applicationId) { Hierarchy hierarchy = (Hierarchy)LogManager.GetRepository(); RollingFileAppender roller = new RollingFileAppe
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
不会返回它)。但是,如果不是dummyilgger.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;
}
}
//getdylogger函数的结尾
GetLogger(loggerName,新的DynamicBlockerFactory(loggerName,dummyILogger));
返回新的LogImpl(dummyilgger);
}
///
///Hierarchy.GetLogger使用的虚拟ILogger工厂实现。
///
内部密封类DynamicBlockerFactory:iLogger工厂
{
私有只读字符串名称;
专用只读记录器;
公共DynamicBloggerFactory(字符串名称,记录器){this.name=name;this.Logger=Logger;}
公共记录器CreateLogger(log4net.Repository.ilogger存储库,字符串名称)
{
如果(name!=this.name){抛出新ArgumentOutOfRangeException(“name”,name,“查询到的意外记录器名称”);}
返回此.logger;
}
}
这样,LogManager.GetLogger
将返回动态创建的记录器。您需要一个很好的理由来使用该代码而不使用配置文件:-)原因是我的应用程序在运行时动态创建社区,我想为每个社区维护一个日志文件。我很担心,因为LoggerImpl是“内部”的,因此显然不应该被实例化。然后我用相同的实现创建了一个副本(DummyLogger),并用它创建了一个ILogImpl,但我不知道log4net是否因为任何特定的原因而避免您自己创建实例:P