【问题标题】:log4net cant insert data to custom columnlog4net 无法将数据插入自定义列
【发布时间】:2017-06-17 00:40:43
【问题描述】:

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

<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>

和我的记录器类:

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);
            }
        }

这里有什么问题?

已编辑: 很明显,它使用给定参数写入 db 和 for message 和 clientip:for exmp: log.Error('Your Ip is::1');我如何告诉 log4net 使用 log4net.LogicalThreadContext.Properties["ClientIp"] 作为 ClientIp 列和 log.error(message) 作为 Message 列

【问题讨论】:

    标签: log4net


    【解决方案1】:

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

    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>
    

    【讨论】:

    • 我不明白,那我怎样才能将日志发布到数据库?你的意思是我不应该将参数传递给 log.Error() 函数。但它需要参数(非参数函数不重载)..我该怎么办
    • 我编辑过但还是一样.. Message 和 Client ip 数据都有 msg 数据
    • 查看编辑,我为列添加了转换模式
    • 像你这样的人是我喜欢这份工作和 stackoverflow 的原因!谢谢!
    【解决方案2】:

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

    例如,我只是将“访问的主页”记录为消息。我添加的列中显示了“访问的主页ac”。

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

    从上面删除 value 属性可以防止数据在添加的列中重复,但现在该列为空。

    我的第二个错误是由于某种未知原因,log4net 不喜欢“机器名”。我不知道问题是列名还是参数名,但我将“机器名”的所有实例都更改为“服务器”(当然包括重命名数据库中的列),一切都开始工作了。

    编辑

    好的,我想我刚刚意识到问题在于 Properties 值区分大小写,所以我使用的是 .Properites["MachineName"] 但应该一直使用 .Properties["machinename"]。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-02-04
      • 2020-09-03
      • 1970-01-01
      • 2012-09-25
      • 1970-01-01
      • 2021-06-21
      • 2013-06-04
      相关资源
      最近更新 更多