首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >mysql数据库日志中的log4net日志记录错误

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

Stack Overflow用户
提问于 2021-02-18 17:39:57
回答 2查看 318关注 0票数 1

我正在使用log4net登录mysql数据库。log4net配置是正确的,因为我已经测试过登录到sql server和文件中,但当我在mysql数据库中写入日志时,它会提示我一个错误。

我的log4net配置如下

代码语言:javascript
运行
复制
<?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>

使用日志的代码在这里

代码语言:javascript
运行
复制
 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)]“这一行。我遇到的错误是

**

代码语言:javascript
运行
复制
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]

**

但实际上我传递了所有必需的参数,我不知道为什么我会得到这个错误。

有没有人能指导。

EN

回答 2

Stack Overflow用户

发布于 2021-02-18 23:20:49

这是MySql.Data中的一个错误。据我所知,目前还没有针对它的bug报告,但您可以从MySqlConnector integration tests中看到,如果在添加参数之前调用MySqlCommand.Prepare,MySql.Data将失败。

然而,这正是what AdoNetAppender does。(该代码中有一个try/catch块,但这是2.0.12之后的最新更改。)

有两种可能的修复方法:

  1. 切换到MySqlConnector并更改<connectionType />以使用它。
  2. IgnorePrepare=true添加到您的MySql.Data连接字符串,这将导致Prepare为no-op。(注意:此选项为removed in 8.0.24.)
票数 2
EN

Stack Overflow用户

发布于 2021-08-02 13:06:18

正如@Bradley Grainger提到的,MySqlConnector可以完成这项工作

遗憾的是,我无法评论,但@hashimkayani向我索要了一个例子,我确实试过了,它工作得很好:

代码语言:javascript
运行
复制
<?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>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66257249

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档