简体   繁体   English

mysql 数据库日志记录中的 log4net 日志记录错误

[英]log4net logging error in mysql database logging

i am using log4net for logging in mysql database.我正在使用 log4net 登录 mysql 数据库。 log4net configuration is correct and because i have tested to log in sql server and in file but when i'm writing logs in mysql database then it prompt an error to me. log4net 配置是正确的,因为我已经测试过登录 sql 服务器和文件,但是当我在 mysql 数据库中写入日志时,它会提示我一个错误。

my log4net config is below我的 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>

and the log consuming code is here日志消费代码在这里

 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");
            }
        }

i also the " [assembly: log4net.Config.XmlConfigurator(ConfigFile = "Web.config", Watch = true)] " this line in assembly file.我也是汇编文件中的“ [assembly: log4net.Config.XmlConfigurator(ConfigFile = "Web.config", Watch = true)] "这一行。 the error i'm encountering is我遇到的错误是

** **

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]

** **

but actually I'm passing all required parameters dnt know why I'm getting this error.但实际上我传递了所有必需的参数,不知道为什么会出现这个错误。

can anyone guide.任何人都可以指导。

This is a bug in MySql.Data.这是 MySql.Data 中的错误。 There isn't a bug report filed for it as far as I know, but you can see from the MySqlConnector integration tests that MySql.Data fails if you call MySqlCommand.Prepare before adding the parameters.据我所知,没有针对它提交的错误报告,但您可以从MySqlConnector 集成测试中看到,如果在添加参数之前调用MySqlCommand.Prepare ,MySql.Data 将失败。

However, that's exactly what AdoNetAppender does .然而,这正是AdoNetAppender所做的。 (There is a try / catch block in that code, but that's a recent change, after 2.0.12.) (该代码中有一个try / catch块,但这是 2.0.12 之后的最新更改。)

There are two possible fixes:有两种可能的修复方法:

  1. Switch to MySqlConnector and change the <connectionType /> to use it.切换到MySqlConnector并更改<connectionType />以使用它。
  2. Add IgnorePrepare=true to your MySql.Data connection string, which will cause Prepare to be a no-op.IgnorePrepare=true添加到 MySql.Data 连接字符串,这将导致Prepare成为无操作。 (Note: this option was removed in 8.0.24 .) (注意:此选项已在 8.0.24 中删除。)

As @Bradley Grainger mentioned, MySqlConnector does the job正如@Bradley Grainger 提到的,MySqlConnector 完成了这项工作

I sadly cannot comment but @hashimkayani asked for an example, I did try it out and it works perfectly fine:遗憾的是,我无法发表评论,但@hashimkayani 要求举个例子,我确实试过了,效果很好:

<?xml version="1.0"?>
<configuration>
    <configSections>
        <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
    </configSections>
    <appSettings>
        <add key="log4net.Internal.Debug" value="true"/>
    </appSettings>
    <log4net>
        <appender name="dbAppender" type="log4net.Appender.AdoNetAppender">
            <bufferSize value="1" />
            <connectionType value="MySqlConnector.MySqlConnection, MySqlConnector" />
            <connectionString value="Server=localhost;Database=dbName;Uid=dbUser;Pwd=dbPassword;persistsecurityinfo=True;SslMode=none;" />
            <commandText value="INSERT INTO afmlog(date, thread, level, logger, message) VALUES (@log_date, @thread, @log_level, @logger, @message);" />
            <parameter>
                <parameterName value="@log_date" />
                <dbType value="DateTime" />
                <layout type="log4net.Layout.PatternLayout" value="%date{yyyy'-'MM'-'dd HH':'mm':'ss'.'fff}" />
            </parameter>
            <parameter>
                <parameterName value="@thread" />
                <dbType value="String" />
                <size value="255" />
                <layout type="log4net.Layout.PatternLayout" value="%thread" />
            </parameter>
            <parameter>
                <parameterName value="@log_level" />
                <dbType value="String" />
                <size value="50" />
                <layout type="log4net.Layout.PatternLayout" value="%level" />
            </parameter>
            <parameter>
                <parameterName value="@logger" />
                <dbType value="String" />
                <size value="255" />
                <layout type="log4net.Layout.PatternLayout" value="%logger" />
            </parameter>
            <parameter>
                <parameterName value="@message" />
                <dbType value="String" />
                <size value="4000" />
                <layout type="log4net.Layout.PatternLayout" value="%message" />
            </parameter>
        </appender>
    </log4net>
    <system.diagnostics>
        <trace autoflush="true">
            <listeners>
                <add
                    name="textWriterTraceListener"
                    type="System.Diagnostics.TextWriterTraceListener"
                    initializeData="C:\temp\log4net.txt" />
            </listeners>
        </trace>
    </system.diagnostics>
</configuration>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM