首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >以编程方式添加appender

以编程方式添加appender
EN

Stack Overflow用户
提问于 2018-10-16 08:20:05
回答 1查看 154关注 0票数 0

在log4net中,我试图使用以下代码以编程方式添加每个实例的附加程序。

我会理解为什么对于RollingFileAppender,我必须写:

代码语言:javascript
复制
((Logger)log.Logger).AddAppender(newFileAppender);

对于AdoNetAppenders,我必须写:

代码语言:javascript
复制
hierarchy.Root.AddAppender(newAdoNetAppender);

如果我写:

代码语言:javascript
复制
hierarchy.Root.AddAppender(newFileAppender);

它将记录每一行两次。

如果我写:

代码语言:javascript
复制
((Logger)log.Logger).AddAppender(newAdoNetAppender);

它不会登录数据库。

或者可能还有其他的错误?

Global.asax

代码语言:javascript
复制
XmlConfigurator.ConfigureAndWatch(new FileInfo("Foo.xml"));

财产定义:

代码语言:javascript
复制
LogicalThreadContext.Properties["InstanceName"] = instance;

代码语言:javascript
复制
public static void SetLog4NetAppenderOptions(ILog log, string instanceName)
    {
        Hierarchy hierarchy = LogManager.GetRepository() as Hierarchy;

        if (hierarchy != null)
        {
            RollingFileAppender genericFileAppender = (RollingFileAppender)hierarchy.GetAppenders().FirstOrDefault(x => x.GetType() == typeof(RollingFileAppender) && x.Name == "RollingFile");
            if (genericFileAppender != null)
            {
                genericFileAppender.Threshold = defaultLevel;
                genericFileAppender.ActivateOptions();

                if (!String.IsNullOrEmpty(instanceName))
                {
                    RollingFileAppender specificFileAppender = (RollingFileAppender)hierarchy.GetAppenders().FirstOrDefault(x => x.GetType() == typeof(RollingFileAppender) && x.Name == "RollingFile_" + instanceName);
                    if (specificFileAppender == null)
                    {
                        RollingFileAppender newFileAppender = new RollingFileAppender();
                        newFileAppender.Threshold = defaultLevel;
                        newFileAppender.AppendToFile = genericFileAppender.AppendToFile;
                        newFileAppender.MaximumFileSize = genericFileAppender.MaximumFileSize;
                        newFileAppender.MaxFileSize = genericFileAppender.MaxFileSize;
                        newFileAppender.LockingModel = genericFileAppender.LockingModel;
                        newFileAppender.Layout = genericFileAppender.Layout;
                        newFileAppender.Name = String.Format("RollingFile_{0}", instanceName);
                        newFileAppender.File = genericFileAppender.File.Replace("_log", "_" + instanceName);                                                    newFileAppender.ActivateOptions();                          ((Logger)log.Logger).AddAppender(newFileAppender);
                    }
                }
            }

                if (!String.IsNullOrEmpty(instanceName))
                {
                    AdoNetAppender specificDbAppender = (AdoNetAppender)hierarchy.GetAppenders().FirstOrDefault(x => x.GetType() == typeof(AdoNetAppender) && x.Name == "AdoNetAppender_" + instanceName);
                    if (specificDbAppender == null)
                    {
                        AdoNetAppender newAdoNetAppender = new AdoNetAppender();
                        newAdoNetAppender.ConnectionType = "Foo";
                        newAdoNetAppender.CommandText = "Foo";
                        newAdoNetAppender.Name = String.Format("AdoNetAppender_{0}", instanceName);
                        newAdoNetAppender.AddParameter(new AdoNetAppenderParameter
                        {
                            ParameterName = "@log_date",
                            DbType = DbType.DateTime,
                            Layout = new RawTimeStampLayout()
                        });
                        // add other parameters
                        newAdoNetAppender.ConnectionString = ConfigurationManager.ConnectionStrings[Settings.Default.ConnectionStringBaseKey + instanceName].ConnectionString;
                        newAdoNetAppender.ActivateOptions();
                        hierarchy.Root.AddAppender(newAdoNetAppender);
                    }
                }
        }
    }

编辑:我必须添加,如果我运行这个代码两次,第二次它将日志忽略过滤器。

EN

回答 1

Stack Overflow用户

发布于 2018-10-16 13:45:43

最后我发现:

代码语言:javascript
复制
hierarchy.Root.AddAppender(newFileAppender);

是最好的解决方案,但只适用于MinimalLock,因此:

代码语言:javascript
复制
newFileAppender.LockingModel = new FileAppender.MinimalLock();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52830955

复制
相关文章

相似问题

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