2016-01-24 3 views
4

Может ли кто-нибудь со второго набора глаз? Мне явно чего-то не хватает.Log4Net не пишет на SQL-таблицу

Я использую Log4Net в приложении веб-API. Всякий раз, когда я вызываю Log.Error(), он выполняется, но ничто фактически не записывается в мою таблицу dbo.Log. Я использую локальную базу данных. Когда я заменил конфигурацию тем, который написал файл, код работал отлично.

Вот как выглядит моя конфигурация и код.

Файл Log4Net.config содержит следующее:

<?xml version="1.0" encoding="utf-8" ?> 
 
<configuration> 
 
    <configSections> 
 
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" /> 
 
    </configSections> 
 

 
    <log4net> 
 
    <appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender"> 
 
     <bufferSize value="100" /> 
 
     <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> 
 
     <connectionString value="Data Source=MUD-DAD\SQLEXPRESS;Initial Catalog=FitAchiever;Persist Security Info=True;User ID=sa;Password=asdadf334"/> 
 
     <commandText value="INSERT INTO dbo.Log ([Date],[Thread],[Level],[Logger],[Message],[Exception]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception)" /> 
 
     <parameter> 
 
     <parameterName value="@log_date" /> 
 
     <dbType value="DateTime" /> 
 
     <layout type="log4net.Layout.RawTimeStampLayout" /> 
 
     </parameter> 
 
     <parameter> 
 
     <parameterName value="@thread" /> 
 
     <dbType value="String" /> 
 
     <size value="255" /> 
 
     <layout type="log4net.Layout.PatternLayout"> 
 
      <conversionPattern value="%thread" /> 
 
     </layout> 
 
     </parameter> 
 
     <parameter> 
 
     <parameterName value="@log_level" /> 
 
     <dbType value="String" /> 
 
     <size value="50" /> 
 
     <layout type="log4net.Layout.PatternLayout"> 
 
      <conversionPattern value="%level" /> 
 
     </layout> 
 
     </parameter> 
 
     <parameter> 
 
     <parameterName value="@logger" /> 
 
     <dbType value="String" /> 
 
     <size value="255" /> 
 
     <layout type="log4net.Layout.PatternLayout"> 
 
      <conversionPattern value="%logger" /> 
 
     </layout> 
 
     </parameter> 
 
     <parameter> 
 
     <parameterName value="@message" /> 
 
     <dbType value="String" /> 
 
     <size value="4000" /> 
 
     <layout type="log4net.Layout.PatternLayout"> 
 
      <conversionPattern value="%message" /> 
 
     </layout> 
 
     </parameter> 
 
     <parameter> 
 
     <parameterName value="@exception" /> 
 
     <dbType value="String" /> 
 
     <size value="2000" /> 
 
     <layout type="log4net.Layout.ExceptionLayout" /> 
 
     </parameter> 
 
    </appender> 
 

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

Файл Global.asax.cs содержит следующее, обратите внимание на вызов метода Log4Net.Config(), который определяет какую конфигурацию использовать.

public class WebApiApplication : System.Web.HttpApplication 
{ 
    private static readonly log4net.ILog Log = log4net.LogManager.GetLogger(typeof(WebApiApplication)); 
    protected void Application_Start() 
    { 

     log4net.Config.XmlConfigurator.Configure(new System.IO.FileInfo(Server.MapPath("Log4Net.config"))); 

     AreaRegistration.RegisterAllAreas(); 
     GlobalConfiguration.Configure(WebApiConfig.Register); 
     FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 
     RouteConfig.RegisterRoutes(RouteTable.Routes); 
     BundleConfig.RegisterBundles(BundleTable.Bundles); 
    } 
} 

}

Инициализация регистратора в моем контроллере есть:

public class FitDashboardController : ApiController 
{ 
    private static readonly ILog log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 

    IFitDashboardService fitDashboardService = new FitDashboardService(); 

...

И вызов:

  catch (System.Exception ex) 
     { 
      log.Error("Error:" + MethodBase.GetCurrentMethod().Name + " :: " + ex.Message); 

     } 

Опять же, код работает при записи в файл , но не базы данных. Есть идеи?

+0

Вы пытались добавить «debug = 'true» в качестве атрибута на свой элемент? Это покажет вам любые проблемы, которые имеет log4net во время инициализации. –

+0

Stephen, я сделал, но я не вижу ничего на выходе, который бы указывал на такую ​​ошибку. Спасибо за совет. – xgp

ответ

6

Этот вопрос был дан ответ here. Проблема в том, ваш <bufferSize> тег, который, согласно связанному ответ ...

<bufferSize value="100" /> 

Он говорит, что он будет держать 100 журналов в памяти, пока не записаны в БД. Может быть, поэтому вы ничего не видите в БД?

Измените свой код, чтобы сказать <bufferSize value="1" />, и это должно привести к тому, что log4net будет записываться в вашу базу данных после сохранения 1 регистрационной памяти. Дополнительную информацию см. В документации Apache по телефону buffersize.

+0

Чейз, ты гвоздь itl Спасибо! – xgp

+1

OMG ты спас меня от убийства! Большое спасибо. –

0

Вы пытались запустить профайлер сервера sql и делать трассировку против базы данных в строке соединения? Представляемая инструкция insert log4net должна отображаться вместе со значениями для различных параметров.

 Смежные вопросы

  • Нет связанных вопросов^_^