log4net - 如何在 AdoNetAppenderParameter.Layout 上调用 ActivateOptions

log4net - how to call ActivateOptions on AdoNetAppenderParameter.Layout

我正在尝试动态配置 log4net 以将日志写入 sql 数据库。为此,我正在使用 log4net 库中的 AdoNetAppender class。

我看到 appender 的 activateOptions 但不是命令参数中定义的 Layout

public override void ActivateOptions();

调用 AdoNetAppender.ActivateOptions() 正在将日志写入数据库,但它 将相同的数据写入所有列 ,而不是 将相应的数据写入相应的列列

我认为这与 Layout 上的 ActiveOptions 有关,但我没有看到 Layout 的 ActivateOptions。

非常感谢任何帮助。

对于遇到此问题的任何人。下面的修复成功了:

public class CustomAdoNetAppender : AdoNetAppender
{
         //code omitted for simplicity
         //parameter using inherited layout
         AddParameter(new AdoNetAppenderParameter()
        {
            ParameterName = "@thread",
            DbType = System.Data.DbType.String,
            Size = 255,
            Layout = new CustomLayout2RawLayoutAdapter(new PatternLayout() { ConversionPattern = "%thread" })
        });
}

private class CustomLayout2RawLayoutAdapter : Layout2RawLayoutAdapter
    {
        private readonly PatternLayout _layout;
        public CustomLayout2RawLayoutAdapter(PatternLayout layout)
            : base(layout)
        {
            _layout = layout;
        }

        public void ActivateOptions()
        {
            _layout.ActivateOptions();
        }
    }

 public override void ActivateOptions()
    {
        base.ActivateOptions();

        if (m_usePreparedCommand)
        {
            foreach (AdoNetAppenderParameter item in m_parameters)
            {
                if (item.Layout is CustomLayout2RawLayoutAdapter)
                    (item.Layout as CustomLayout2RawLayoutAdapter).ActivateOptions();
            }
        }
    }