Настройте log4net AdoNetAppender в основном приложении asp.net - PullRequest
0 голосов
/ 04 января 2019

Я пытаюсь настроить log4net, используя MicroKnights AdoNetAppender (сторонняя библиотека nuget) для моего основного приложения asp.net.Однако ничего не регистрируется в базе данных.Также я не получаю никаких ошибок при запуске приложения.Я подозреваю, что connectionType вызывает проблему.

файл конфигурации log4net:

    <log4net>
  <appender name="AdoNetAppender" type="MicroKnights.Logging.AdoNetAppender, MicroKnights.Log4NetAdoNetAppender">
    <bufferSize value="1" />
    <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=4.4.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
    <connectionStringName value="log4net" />
    <connectionStringFile value="appsettings.json" />
    <commandText value="INSERT INTO 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="ALL" />
    <appender-ref ref="AdoNetAppender" />
  </root>
</log4net>

appsettings.json:

{
  "Logging": {
    "LogLevel": {
      "Default": "Warning"
    }
  },
  "AllowedHosts": "*",
  "connectionStrings": {
    "log4net": "Server=[[ServerName]]; Database=[[DatabaseName]]; Trusted_Connection=True; MultipleActiveResultSets=true"
  }
}

Основной метод в program.cs

 public static void Main(string[] args)
        {
            var logRepository = LogManager.GetRepository(Assembly.GetEntryAssembly());
            XmlConfigurator.Configure(logRepository, new FileInfo("log4net.config"));

            ILog log = log4net.LogManager.GetLogger("Logger");

            log.Info("logging to database");

            CreateWebHostBuilder(args).Build().Run();
        }

Буду признателен за любую помощь.

1 Ответ

0 голосов
/ 16 января 2019

Попробуйте добавить атрибут debug в корневой элемент log4net.

<log4net debug="true">

Это позволит вам увидеть выходные данные отладки при запуске приложения.Я сделал это с примером, который вы предоставили, и он сообщил об ошибке с типом соединения.Ошибка была

log4net: Setting Collection Property [AddParameter] to object [MicroKnights.Logging.AdoNetAppenderParameter]
log4net:ERROR [AdoNetAppender] ErrorCode: GenericFailure. Failed to load connection type [System.Data.SqlClient.SqlConnection, System.Data, Version=4.4.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a]
System.IO.FileLoadException: Could not load file or assembly 'System.Data, Version=4.4.0.65535, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)
File name: 'System.Data, Version=4.4.0.65535, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'
   at System.RuntimeTypeHandle.GetTypeByName(String name, Boolean throwOnError, Boolean ignoreCase, Boolean reflectionOnly, StackCrawlMarkHandle stackMark, IntPtr pPrivHostBinder, Boolean loadTypeFromPartialName, ObjectHandleOnStack type, ObjectHandleOnStack keepalive)
   at System.RuntimeTypeHandle.GetTypeByName(String name, Boolean throwOnError, Boolean ignoreCase, Boolean reflectionOnly, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean loadTypeFromPartialName)
   at System.RuntimeType.GetType(String typeName, Boolean throwOnError, Boolean ignoreCase, Boolean reflectionOnly, StackCrawlMark& stackMark)
   at System.Type.GetType(String typeName, Boolean throwOnError, Boolean ignoreCase)
   at log4net.Util.SystemInfo.GetTypeFromString(Assembly relativeAssembly, String typeName, Boolean throwOnError, Boolean ignoreCase)
   at MicroKnights.Logging.AdoNetAppender.ResolveConnectionType()

Я подозреваю, что если вы измените эту строку

<connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=4.4.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />

на

<connectionType value="System.Data.SqlClient.SqlConnection, System.Data" />

, она будет работать.В версии MicroKnights 1.0.2 внесено изменение для использования доступной версии System.Data.SqlClient.

...