Ошибка ведения журнала log4net в ведении журнала базы данных mysql

Я использую log4net для входа в базу данных mysql. Конфигурация log4net верна, и потому что я тестировал вход на сервер sql и в файл, но когда я пишу журналы в базе данных mysql, мне выдается ошибка.

моя конфигурация log4net ниже

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>  
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>  
  </configSections>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6"/>
    </startup>

  <log4net>
    <appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender">
      <bufferSize value="1" />
      <connectionType value="MySql.Data.MySqlClient.MySqlConnection, MySql.Data" />
      <connectionString value="Server=127.0.0.1;Database=logdb;Uid=abc;Pwd=abc;" />
      <commandText value="INSERT INTO log (timestamp,Thread,Level,Logger,Message) VALUES (?log_date, ?thread, ?log_level, ?logger, ?message);" />
      <parameter>
        <parameterName value="?log_date" />
        <dbType value="DateTime" />
        <layout type="log4net.Layout.RawTimeStampLayout" />
      </parameter>
      <parameter>
        <parameterName value="?thread" />
        <dbType value="String" />
        <size value="32" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%thread" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value="?log_level" />
        <dbType value="String" />
        <size value="32" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%level" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value="?logger" />
        <dbType value="String" />
        <size value="256" />
        <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>
      
    </appender>
    <root>
      <level value="ALL" />
      <appender-ref ref="AdoNetAppender" />
    </root>
  </log4net>
  
  <appSettings>
    <add key="log4net.Internal.Debug" value="true"/>
  </appSettings>

<system.diagnostics>
    <trace autoflush="true">
      <listeners>
        <add name="textWriterTraceListener" type="System.Diagnostics.TextWriterTraceListener" initializeData="C:\Logs\log4net.txt"/>
      </listeners>
    </trace>
  </system.diagnostics>
</configuration>

и код потребления журнала здесь

 class Program
        {
            private static readonly ILog Logger = LogManager.GetLogger(System.Environment.MachineName);
    
            static void Main(string[] args)
            {
                log4net.Config.XmlConfigurator.Configure();
    
                Logger.Info("Testing information log from .Net app");
                Logger.Debug("Testing Debug log from .Net app");
                Logger.Fatal("Testing Fatal log from .Net app");
            }
        }

я также [assembly: log4net.Config.XmlConfigurator(ConfigFile = "Web.config", Watch = true)] эту строку в файле сборки. ошибка, с которой я сталкиваюсь,

**

log4net:ERROR [AdoNetAppender] ErrorCode: GenericFailure. Exception while writing to database
System.InvalidOperationException: Parameter '?log_date' was not found during prepare.
   at MySql.Data.MySqlClient.PreparableStatement.Prepare()
   at MySql.Data.MySqlClient.MySqlCommand.Prepare(Int32 cursorPageSize)
   at MySql.Data.MySqlClient.MySqlCommand.Prepare()
   at log4net.Appender.AdoNetAppender.SendBuffer(IDbTransaction dbTran, LoggingEvent[] events)
   at log4net.Appender.AdoNetAppender.SendBuffer(LoggingEvent[] events)
log4net: Shutdown called on Hierarchy [log4net-default-repository]

**

но на самом деле я передаю все необходимые параметры, не знаю, почему я получаю эту ошибку.

может кто подскажет.


person hashimkayani    schedule 18.02.2021    source источник


Ответы (1)


Это ошибка в MySql.Data. Насколько я знаю, для него не было подано отчета об ошибке, но вы можете увидеть его из .cs#L26-L41" rel="nofollow noreferrer">Интеграция MySqlConnector проверяет, что MySql.Data дает сбой, если вы вызываете MySqlCommand.Prepare перед добавлением параметров.

Однако это именно что делает AdoNetAppender. (В этом коде есть блок try/catch, но это недавнее изменение, после 2.0.12.)

Есть два возможных исправления:

  1. Переключитесь на MySqlConnector и измените <connectionType />, чтобы использовать его.
  2. Добавьте IgnorePrepare=true в строку подключения MySql.Data, что приведет к тому, что Prepare будет неактивным.
person Bradley Grainger    schedule 18.02.2021
comment
может показать какой-нибудь пример mysqlconnector? - person hashimkayani; 22.02.2021
comment
@hashimkayani Я еще не тестировал его, но обновлю mysqlconnector.net/overview/logging, если Я получаю это работает. - person Bradley Grainger; 22.02.2021