使用带有代码内设置的log4net,它会记录两次

时间:2015-02-13 08:39:10

标签: logging log4net-configuration

大家好,首先请原谅我的英语不好,尽量做到尽可能准确。

我在.NET Framework 4.5中使用 log4net 3.5。

我实际面临的问题非常普遍。 log4net记录了两次。它没有配置xml文件,我使用静态类来执行此操作。

/// <summary>
/// Diese Klasse konfiguriert die Logs bei ausführungszeit
/// </summary>
public static class LoggerSetup
{
    static LoggerSetup()
    {
        _fileDirectory = @"Log\";
        _archiveInterval = 7;
        Setup();
    }

    /// <summary>
    /// Der Ort wo das Logfile gespeichert wird
    /// </summary>
    public static string FileDirectory
    {
        get
        {
            return _fileDirectory;
        }
        set
        {
            _fileDirectory = value;
            Setup();

        }
    }
    private static string _fileDirectory;

    /// <summary>
    /// Wieviele Tage die Logfiles im Speicher bleiben
    /// </summary>
    public static int ArchiveInterval
    {
        get
        {
            return _archiveInterval;
        }
        set
        {
            if (value <= 0)
                value = 1;
            _archiveInterval = value;
            Setup();
        }
    }
    private static int _archiveInterval;



    private static void Setup()
    {
        // Here the hierarchy object is taken
        Hierarchy hierarchy = (Hierarchy)LogManager.GetRepository();

        // Pattern Layout defined
        PatternLayout patternLayout = new PatternLayout();
        patternLayout.ConversionPattern = "%date [%-5level] %message%newline";
        patternLayout.ActivateOptions();

        // configurating the RollingFileAppender object
        RollingFileAppender roller = new RollingFileAppender();
        roller.AppendToFile = true;
        roller.File = FileDirectory + "Log.log";
        roller.StaticLogFileName = true;
        roller.PreserveLogFileNameExtension = true;
        roller.LockingModel = new FileAppender.MinimalLock();
        roller.Layout = patternLayout;
        roller.MaxSizeRollBackups = ArchiveInterval;
        roller.RollingStyle = RollingFileAppender.RollingMode.Date;
        roller.DatePattern = "_yyyy-MM-dd";    
        roller.ActivateOptions();

        // Here it is added only once to the Root
        hierarchy.Root.AddAppender(roller);

        hierarchy.Root.Level = Level.Info;
        hierarchy.Configured = true;
    }
}

我一直在查找其他一些页面,例如

在我发现的那些问题中,线程中有一个双重添加一个appender,大部分都被添加到根和一个logger对象。

正如您在上面的代码中所看到的,我只做了一次......有什么想法吗?每次更新属性时都会调用 Setup()方法,而不是其他任何方法。

我很感谢我得到的任何答案。

1 个答案:

答案 0 :(得分:0)

我实际上是自己解决了...问题是,每次 Setup()执行时,就会有一个新的Rolling file appender实例添加到根目录。< / p>

我这样解决了:

    private static RollingFileAppender _roller;
    private static PatternLayout _patternLayout;

    static LoggerSetup()
    {
        // root config
        Hierarchy hierarchy = (Hierarchy)LogManager.GetRepository();
        hierarchy.Root.Level = Level.Info;
        hierarchy.Configured = true;

        // appender vorbereiten
        _roller = new RollingFileAppender();
        _patternLayout = new PatternLayout();
        _roller.Layout = _patternLayout;


        hierarchy.Root.AddAppender(_roller);

        _fileDirectory = @"Log\";
        _archiveInterval = 7;
        Setup();
    }


    public static void Setup()
    {
        _roller.AppendToFile = true;
        _roller.File = FileDirectory + "Log.log";
        _roller.StaticLogFileName = true;
        _roller.PreserveLogFileNameExtension = true;
        _roller.LockingModel = new FileAppender.MinimalLock();
        _roller.MaxSizeRollBackups = ArchiveInterval;
        _roller.RollingStyle = RollingFileAppender.RollingMode.Date;
        _roller.DatePattern = "_yyyy-MM-dd";

        _patternLayout.ConversionPattern = "%date [%-5level] %message%newline";
        _patternLayout.ActivateOptions();

        _roller.ActivateOptions();

    }

现在可以根据需要多次执行Setup(),它不会再使appender加倍。