2012-06-28 4 views
1

У меня возникли проблемы с входом в мою базу данных с помощью Log4Net.
Я не совсем уверен, что делать с моими результатами. Я получаю имя поля, когда мне нужно получать значения полей.При использовании 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.

И мой 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 

Это кажется таким глупая, исправляемая вещь, но она ускользает от меня. Какие-либо предложения? Благодарю.

+0

Я действительно приложил к этому достойные усилия, чтобы кто-то меня ниспроверг, я задаюсь вопросом, приложили ли они какие-либо исследовательские усилия для чтения моего вопроса. И, если это так, я хотел бы знать, почему я получил нисходящее направление. –

ответ

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> 

Очевидным недостатком является то, что вы не смогли бы получить приличный вывод в файле или на консоли. Есть способы обойти это (собственный конвертер макетов), но я не уверен, что это правильный подход.

Второй вариант:
Вы можете использовать так называемые свойства контекста (здесь это хорошо tutorial). В частности, посмотрите на «Расчетные значения контекста». Я не уверен, что я должен написать об этом ... может быть, если у вас есть конкретные вопросы об этом, я могу ответить на них.

+0

Спасибо Стефан. Я ценю ваш ответ. Недавно я изменил свои приложения. Когда я выводил свои данные в CSV, используя , это сработало отлично. Класс LOG сделал трюк. Когда я перешел в <имя_объекта = "SqlLogger" type = "log4net.Appender.AdoNetAppender">, он начал сбой. Кажется, существует разница между тем, как эти два приложения обрабатывают класс LOG. Почему это так? –

+0

Хорошо, не обращайте внимания на мой предыдущий вопрос. Я вижу, что здесь происходит ... –