log4net无法将数据插入自定义列

时间:2016-08-18 09:22:52

标签: log4net

为基本lognet列编写数据库很好,但是我添加了另一个名为“clientIp”的列,并将数据设置为Ilog对象bofore日志,但是它将与Message列相同的数据写入ClintIp列..这里我的配置和文件以及db screenshot:

<appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender">
      ...
      <commandText value="INSERT INTO Log ([Date],[Thread],[Level],[Logger],[Message],[Exception],[ClientIp]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception, @clientip)" />
      <parameter>
        <parameterName value="@log_date" />
        <dbType value="DateTime" />
        <layout type="log4net.Layout.RawTimeStampLayout" />
      </parameter>
     ...
      <parameter>
        <parameterName value="@exception" />
        <dbType value="String" />
        <size value="2000" />
        <layout type="log4net.Layout.ExceptionLayout" />
      </parameter>
      <parameter>
        <parameterName value="@clientip" />
        <dbType value="String" />
        <size value="50" />
        <layout type="log4net.Layout.PatternLayout" />
      </parameter>
    </appender>

enter image description here 和我的记录器类:

public static class Logger
    {

        private static ILog log  {get; set;}
        static Logger()
        {
            log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
        }
        public static void Error(object msg, string userip)
        {
            log4net.LogicalThreadContext.Properties["ClientIp"] = userip;
            if (log.IsErrorEnabled)
            {
                log.Error(msg);
            }
        }

这是什么问题?

编辑: 很明显,它使用给定参数写入带有消息和clientip的db:for exmp:log.Error('Your Ip is :: 1');如何告诉log4net使用ClientIp列的log4net.LogicalThreadContext.Properties [“ClientIp”]和Message列的log.error(message)

2 个答案:

答案 0 :(得分:2)

您的代码不正确,应该是:

public static void Error(object msg, string userip)
    {
        log4net.LogicalThreadContext.Properties["ClientIp"] = userip;
        if (log.IsErrorEnabled)
        {
            log.Error(msg); //<----Here is your error
        }
    }

并在ip栏中添加:

<parameter>
    <parameterName value="@clientip" />
    <dbType value="String" />
    <size value="50" />
    <layout type="log4net.Layout.PatternLayout" >
          <conversionPattern value="%property{ClientIp}" />
    </layout>
  </parameter>

答案 1 :(得分:1)

如果这对其他人有帮助,我遇到了同样的问题:我添加的列中的数据在“消息”列中“稍微”重复。

例如,我只是将“访问的主页”记录为消息。我添加的专栏中显示了“access home pageac”。

我的第一个错误是布局类型后面有一个value属性:

从上面删除value属性会阻止数据在添加的列中重复,但现在该列为null。

我的第二个错误是,由于某些未知原因,log4net不喜欢'machinename'。我不知道问题是列名称还是参数名称,但我将'machinename'的所有实例都更改为'server'(当然包括重命名DB中的列),这一切都开始工作了。 / p>

修改

好吧我想我刚刚意识到问题是属性值区分大小写,所以我使用.Properites [“MachineName”]但应该使用.Properties [“machinename”]。