Log4net重复日志记录 [英] Log4net duplicate logging entires

查看:164
本文介绍了Log4net重复日志记录的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我最近把log4net日志从配置文件切换到以编程方式设置。这导致不合适的条目重复2次或有时3次。这是代码。它使用一个看起来像这样的字符串logger1 | debug,logger2 | info

  private void SetupLog4netLoggers()
{
IAppender appender = GetAppender();

SetupRootLogger(appender);

foreach(记录器中的字符串记录器)
{
CommaStringList parts = new CommaStringList(logger,'|');
if(parts.Count!= 2)
continue;

AddLogger(parts [0],parts [1],appender);
}

log.Debug(Log4net已设置);
}

private IAppender GetAppender()
{
RollingFileAppender appender = new RollingFileAppender();
appender.File = LogFile;
appender.AppendToFile = true;
appender.MaximumFileSize = MaximumFileSize;
appender.MaxSizeRollBackups = MaximumBackups;

PatternLayout layout = new PatternLayout(PATTERN);
layout.ActivateOptions();

appender.Layout = layout;
appender.ActivateOptions();

return appender;
}

private void SetupRootLogger(IAppender appender)
{
层次结构=(层次结构)LogManager.GetRepository();

hierarchy.Root.RemoveAllAppenders();
hierarchy.Root.AddAppender(appender);
hierarchy.Root.Level = GetLevel(RootLevel);

hierarchy.Configured = true;

log.Debug(root logger setup,level [+ RootLevel +]);
}

private void AddLogger(string name,string level,IAppender appender)
{
Logger logger = LogManager.GetRepository()。GetLogger(name)as Logger ;
if(logger == null)
return;

logger.Level = GetLevel(level);
logger.Additivity = false;
logger.RemoveAllAppenders();
logger.AddAppender(appender);

log.Debug(logger [+ name +] added,level [+ level +]);
}

这是我们在日志中看到的一个例子...



  2010-05-06 15:50:39,781 [1] DEBUG NHibernate.Impl.SessionImpl  - 运行ISession.Dispose()
2010-05-06 15:50:39,781 [1] DEBUG NHibernate.Impl.SessionImpl - 关闭会话
2010-05-06 15:50:39,781 [1] DEBUG NHibernate.AdoNet.AbstractBatcher - 运行BatcherImpl .Dispose(true)
2010-05-06 15:50:39,796 [1] DEBUG NHibernate.Impl.SessionImpl - 运行ISession.Dispose()
2010-05-06 15:50:39,796 [ 1] DEBUG NHibernate.Impl.SessionImpl - 关闭会话
2010-05-06 15:50:39,796 [1] DEBUG NHibernate.AdoNet.AbstractBatcher - 运行BatcherImpl.Dispose(true)
2010-05- 06 15:50:39,796 [1] DEBUG NHibernate.Impl.SessionImpl - 运行ISession.Dispose()
2010-05-06 15:50:39,796 [1] DEBUG NHibernate.Impl.SessionImpl - 关闭会话
2010-05-06 15:50:39,796 [1] DEBUG NHibernate.AdoNet.AbstractBatcher - 运行BatcherImpl.Dispose(true)

欢迎任何提示。

解决方案

p>我认为答案是 - 它实际上不是重复的。没有调试NHibernate代码我不能确定,但​​我猜它可能只是写出来或反复做同样的事情。

我们要回到使用配置文件无论如何,将不得不看到我是否仍然可以重复。


I recently switched out log4net logging from using config files to being set up programmatically. This has resulted in the nhiberate entries getting repeated 2 or sometimes 3 times. Here's the code. It uses a string which looks something like this "logger1|debug,logger2|info"

    private void SetupLog4netLoggers()
    {
        IAppender appender = GetAppender();

        SetupRootLogger(appender);

        foreach (string logger in Loggers)
        {
            CommaStringList parts = new CommaStringList(logger, '|');
            if (parts.Count != 2)
                continue;

            AddLogger(parts[0], parts[1], appender);
        }

        log.Debug("Log4net has been setup");
    }

    private IAppender GetAppender()
    {
        RollingFileAppender appender = new RollingFileAppender();
        appender.File = LogFile;
        appender.AppendToFile = true;
        appender.MaximumFileSize = MaximumFileSize;
        appender.MaxSizeRollBackups = MaximumBackups;

        PatternLayout layout = new PatternLayout(PATTERN);
        layout.ActivateOptions();

        appender.Layout = layout;
        appender.ActivateOptions();

        return appender;
    }

    private void SetupRootLogger(IAppender appender)
    {
        Hierarchy hierarchy = (Hierarchy)LogManager.GetRepository();

        hierarchy.Root.RemoveAllAppenders();
        hierarchy.Root.AddAppender(appender);
        hierarchy.Root.Level = GetLevel(RootLevel);

        hierarchy.Configured = true;

        log.Debug("Root logger setup, level[" + RootLevel + "]");
    }

    private void AddLogger(string name, string level, IAppender appender)
    {
        Logger logger = LogManager.GetRepository().GetLogger(name)as Logger;
        if (logger == null)
            return;

        logger.Level = GetLevel(level);
        logger.Additivity = false;
        logger.RemoveAllAppenders();
        logger.AddAppender(appender);

        log.Debug("logger[" + name + "] added, level[" + level + "]");
    }

And here's an example of what we see in our logs...

2010-05-06 15:50:39,781 [1] DEBUG NHibernate.Impl.SessionImpl - running ISession.Dispose()
2010-05-06 15:50:39,781 [1] DEBUG NHibernate.Impl.SessionImpl - closing session
2010-05-06 15:50:39,781 [1] DEBUG NHibernate.AdoNet.AbstractBatcher - running BatcherImpl.Dispose(true)
2010-05-06 15:50:39,796 [1] DEBUG NHibernate.Impl.SessionImpl - running ISession.Dispose()
2010-05-06 15:50:39,796 [1] DEBUG NHibernate.Impl.SessionImpl - closing session
2010-05-06 15:50:39,796 [1] DEBUG NHibernate.AdoNet.AbstractBatcher - running BatcherImpl.Dispose(true)
2010-05-06 15:50:39,796 [1] DEBUG NHibernate.Impl.SessionImpl - running ISession.Dispose()
2010-05-06 15:50:39,796 [1] DEBUG NHibernate.Impl.SessionImpl - closing session
2010-05-06 15:50:39,796 [1] DEBUG NHibernate.AdoNet.AbstractBatcher - running BatcherImpl.Dispose(true)

Any hints welcome.

解决方案

I think the answer is - its not in fact writing duplicates. Without debugging the NHibernate code I can't be sure but I'm guessing its probably just writing it out or doing same thing repeatedly

We're going back to using config files anyway so will have to see if I still get possible duplicates.

这篇关于Log4net重复日志记录的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆