Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# log4net:动态创建一个记录器,我应该担心什么吗?_C#_.net_Logging_Log4net - Fatal编程技术网

C# log4net:动态创建一个记录器,我应该担心什么吗?

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

我需要动态创建记录器,所以在一篇帖子和reflector的帮助下,我成功地动态创建记录器,但我想知道我是否应该担心其他事情。。。我不知道这会有什么影响

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