1

我在使用 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 类只是一堆字符串类型的 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

这似乎是一件愚蠢的、可以修复的事情,但它让我无法理解。有什么建议么?谢谢。

4

1 回答 1

0

log4net 不知道如何处理您的Log课程,因此只需调用ToString()它...我想您有两个选择。

第一个选项:
您让您的类返回您对在数据库存储过程中解析的某种格式感兴趣的字段。例如

emotivtype|emotivevalue|other fields...

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

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

明显的缺点是您无法在文件或控制台中获得体面的输出。有一些方法可以解决这个问题(自定义布局转换器),但我不确定这是否是正确的方法。

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

于 2012-06-30T10:46:07.600 回答