Log4Net记录日志到数据库启动24小时后将无法向mysql数据库插入数据

最近用Log4Net做成服务把日志记录到MySql数据库可是发现可以个奇怪的的问题,每过一个晚上Log4Net就不会自动向MySql数据库记录日志,后来经过多方面测试发现这个问题主要是Mysql会把空闲8小时(wait_timeout默认值为28800秒)没有操作的数据库连接给主动断开,由于晚上没有操作造成log4net长时间没有记录日志,mysql把数据库连接断开了,到第二天白天开始写日志时由于数据库连接状态部位打开状态而被跳过了记录操作,

在github上下载了log4net的源码发现有一个“ReconnectOnError”的参数意图是在数据库连接异常时是否重新连接,在构造函数中设置了默认值为false错误不重连

解决方案:

方案1、把mysql的wait_timeout设置长一些具体多长根据自己实际需求;
方案2、在log4net的配置文件中添加一行“
方案3、下log4net载源码修改掉ReconnectOnError的默认值;

AdoNetAppender代码片段:

public class AdoNetAppender : BufferingAppenderSkeleton
{
    #region Public Instance Constructors

    ///  
    /// Initializes a new instance of the  class.
    /// 
    /// 
    /// Public default constructor to initialize a new instance of this class.
    /// 
    public AdoNetAppender()
    {
        m_connectionType = "System.Data.OleDb.OleDbConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089";
        m_useTransactions = true;
        m_commandType = System.Data.CommandType.Text;
        m_parameters = new ArrayList();
        m_reconnectOnError = false;
    }

    private bool m_reconnectOnError;
……
    public bool ReconnectOnError
    {
        get { return m_reconnectOnError; }
        set { m_reconnectOnError = value; }
    }
……
    override protected void SendBuffer(LoggingEvent[] events)
    {
        if (m_reconnectOnError && (m_dbConnection == null || m_dbConnection.State != ConnectionState.Open))
        {
            LogLog.Debug(declaringType, "Attempting to reconnect to database. Current Connection State: " + ((m_dbConnection==null)?SystemInfo.NullText:m_dbConnection.State.ToString()) );

            InitializeDatabaseConnection();
            InitializeDatabaseCommand();
        }

        // Check that the connection exists and is open
        if (m_dbConnection != null && m_dbConnection.State == ConnectionState.Open)
        {
            if (m_useTransactions)
            {
                // Create transaction
                // NJC - Do this on 2 lines because it can confuse the debugger
                IDbTransaction dbTran = null;
                try
                {
                    dbTran = m_dbConnection.BeginTransaction();

                    SendBuffer(dbTran, events);

                    // commit transaction
                    dbTran.Commit();
                }
                catch(Exception ex)
                {
                    // rollback the transaction
                    if (dbTran != null)
                    {
                        try
                        {
                            dbTran.Rollback();
                        }
                        catch(Exception)
                        {
                            // Ignore exception
                        }
                    }

                    // Can't insert into the database. That's a bad thing
                    ErrorHandler.Error("Exception while writing to database", ex);
                }
            }
            else
            {
                // Send without transaction
                SendBuffer(null, events);
            }
        }
    }
}




Log4Net配置文件:



  
    


你可能感兴趣的:(C#,ASP.NET,Log4Net)