首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >程序化Log4Net配置复制条目

程序化Log4Net配置复制条目
EN

Stack Overflow用户
提问于 2012-08-21 05:45:02
回答 2查看 1.3K关注 0票数 2

我想以编程方式(因为文件路径是在运行时生成的)为SQL语句创建一个单独的日志文件。我的代码如下所示

代码语言:javascript
复制
  public static void InitializeLogger(FileInfo logFile, FileInfo sqlLogFile, 
             Level threshhold, string layout = PATTERN_LAYOUT, bool rolling = true)
    {
        var hierarchy = (Hierarchy)LogManager.GetRepository();
        var appender = CreateAppender(true, layout, APPENDER_NAME, logFile, threshhold);
        hierarchy.Root.AddAppender(appender);

        var sqlAppender = CreateAppender(rolling, layout, SQL_APPENDER_NAME, sqlLogFile, Level.Info);

        var sqlLogger = (Logger)LogManager.GetLogger(SQL_LOGGER_NAME).Logger;
        sqlLogger.RemoveAllAppenders();
        sqlLogger.AddAppender(sqlAppender);
        sqlLogger.Level = Level.Info;
    }

    private static FileAppender CreateAppender(bool rolling, string layout, string appenderName, FileInfo fileInfo, Level threshhold)
    {
        FileAppender result;
        if (rolling)
        {
            result = new RollingFileAppender
                     {
                         AppendToFile = true,
                         ImmediateFlush = true,
                         Name = appenderName,
                         Layout = new PatternLayout(layout),
                         Threshold = threshhold,
                         File = fileInfo.FullName,
                         RollingStyle = RollingFileAppender.RollingMode.Date,
                         StaticLogFileName = true
                     };
        }
        else
        {
            result = new FileAppender
                     {
                         AppendToFile = true,
                         ImmediateFlush = true,
                         Name = appenderName,
                         Layout = new PatternLayout(layout),
                         Threshold = threshhold,
                         File = fileInfo.FullName
                     };
        }
        result.ActivateOptions();
        return result;
    }

    public static void LogSQL(this ILog logger, string sql)
    {
        var sqlLogger = LogManager.GetLogger(SQL_LOGGER_NAME);
        sqlLogger.InfoFormat("Sql: {0}", sql);
    }

问题是LogSQL似乎同时记录到两个日志文件。有什么建议吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-08-21 09:16:47

票数 1
EN

Stack Overflow用户

发布于 2014-03-14 22:37:47

ColeW的答案是正确的。要防止调用调用层次结构中的所有附加器,请通过设置添加性标志来禁用继承的附加器。

从编程上看,这看起来如下所示:

代码语言:javascript
复制
((log4net.Repository.Hierarchy.Logger)log.Logger).Additivity = false; 
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12045664

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档