簡體   English   中英

log4net:動態創建記錄器,我應該擔心什么嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM