使用Log4Net登录数据库时,字段名称显示而不是值

时间:2012-06-28 21:25:19

标签: sql-server log4net log4net-configuration

我在使用Log4Net登录数据库时遇到问题 我不太清楚我的结果如何。当我得到字段的值时,我一直得到字段名称。

该程序是SystemTray实用程序。我已将Log4Net设置如下。

在议会中:

[assembly: log4net.Config.XmlConfigurator(Watch = true)]

在Program.cs中:

 private static readonly ILog log = LogManager.GetLogger(typeof(Program));

        [STAThread]
        static void Main()
        {
            log4net.Config.XmlConfigurator.Configure();

在通话类中:

public class HostManager
{

    #region constants

        protected static readonly ILog log = LogManager.GetLogger(typeof(HostManager));

        ...

        // Inside an event method:

          try
            {

                log.Info(new Log
                {   
                    CreateDate = DateTime.Now.ToString(),
                    SystemUpTime = FormatUpTime(_states.TimeFromStart),
                    EmotivType = "boredom",
                    EmotivValue = _states.AffectivEngagementBoredomScore.ToString(),
                    EventTimer = _eventTimer,
                    SubEventTimer = _subEventTimer
                });


            }

Log类只是一堆类型为string的getter和setter。

并且,我的app.config文件包含log4net设置:

 <log4net>
    <appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender">

      <bufferSize value="1"/>
      <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
      <connectionString value="Data Source=localhost; Initial Catalog=[MyDatabase]; Integrated Security=True;"/>

      <commandText value="INSERT INTO Session ([CreateDate], [SystemUpTime], [EmotivType], [EmotivValue], [EventTimer], [SubEventTimer]) 
                   VALUES (@createdate, @systemuptime, @emotivtype, @emotivvalue, @eventtimer, @subeventtimer)"/>

      <parameter>
        <parameterName value="@createdate"/>
        <dbType value="DateTime"/>
        <layout type="log4net.Layout.RawTimeStampLayout" />
      </parameter>

       <parameter>
        <parameterName value="@systemuptime"/>
        <dbType value="DateTime"/>
        <layout type="log4net.Layout.RawTimeStampLayout"/>
      </parameter>

     <parameter>
    <parameterName value="@emotivtype" />
    <dbType value="String" />
    <size value="50" />
    <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%emotivtype" />
  </layout>
  </parameter>

  <parameter>
    <parameterName value="@emotivvalue"/>
    <dbType value="String"/>
    <size value="255"/>
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%emotivvalue"/>
    </layout>
  </parameter>

      <parameter>
        <parameterName value="@eventtimer"/>
        <dbType value="DateTime"/>
        <layout type="log4net.Layout.RawTimeStampLayout"/>
      </parameter>

      <parameter>
        <parameterName value="@subeventtimer"/>
        <dbType value="DateTime"/>
        <layout type="log4net.Layout.RawTimeStampLayout"/>
      </parameter>

    </appender>
    <root>
      <level value="ALL"/>
      <appender-ref ref="AdoNetAppender"/>
    </root>
  </log4net>

结果是%emotivtype和%emotivalue总是收到字段名称:

ID  CreateDate  SystemUpTime    EmotivType  EmotivValue EventTimer  SubEventTimer
13547   17:06:56.787    17:06:56.787    emotivtype  emotivvalue 17:06:56.787    17:06:56.787

这看起来像是一个愚蠢的,可修复的东西,但它逃脱了我。有什么建议?感谢。

1 个答案:

答案 0 :(得分:0)

log4net不知道如何处理您的Log课程,因此只需在其上调用ToString() ...我猜您有两种选择。

第一选择:
您使类以某种格式返回您感兴趣的字段,这些格式在数据库的存储过程中进行解析。 E.g。

emotivtype|emotivevalue|other fields...

然后为存储过程配置一个参数(您需要一个参数来解析数据库中的上述字符串。

<parameter>
    <parameterName value="@emotivvalue"/>
    <dbType value="String"/>
    <size value="255"/>
    <layout type="log4net.Layout.PatternLayout">
       <conversionPattern value="%message"/>
    </layout>
</parameter>

明显的缺点是你无法在文件或控制台上获得合适的输出。有这种方法(自定义布局转换器),但我不确定这是否是正确的方法。

第二种选择:
您可以使用所谓的上下文属性(这里是一个很好的tutorial)。特别要看“计算的上下文值”。我不确定我应该写些什么...也许如果你有具体问题我可以回答它们。