代码之家  ›  专栏  ›  技术社区  ›  Sandip Dobariya

Log4Net在其登录文件出错后未登录数据库

  •  0
  • Sandip Dobariya  · 技术社区  · 8 年前

    我有一个奇怪的问题,它正在进入log4net。 我已经使用AdoDotNet appender启用了log4net。它通常工作正常,可以登录到数据库,但有时会突然停止工作,不登录到数据库。但是,当我们将级别信息从info更改为debug,然后再次将debug更改为info时,它就会开始工作并登录到数据库。 我做了进一步的研究,启用了log4net内部调试,并并行添加了RollingFileAppenderInforErrorLogger appender,以跟踪is问题是来自AdonetAppender还是log4net general。

    所以现在,当这个问题在log4net内部调试中发生时,它抛出下面的错误,并停止登录数据库,除非我在log4net配置中更改某些内容 但它会一直登录到文件appender
    这个错误是传输错误,所以我的问题是为什么log4net在出现异常后并没有启动,但仍然登录到文件中?在这种异常之后,我们如何重新启动数据库日志记录。

    log4net:ERROR [AdoNetAppender] ErrorCode: GenericFailure. Failed in DoAppend
    System.Data.SqlClient.SqlException (0x80131904): A transport-level error has occurred when sending the request to the server. (provider: Named Pipes Provider, error: 0 - The specified network name is no longer available.) ---> System.ComponentModel.Win32Exception (0x80004005): The specified network name is no longer available
       at System.Data.SqlClient.TdsParser.TdsExecuteRPC(_SqlRPC[] rpcArray, Int32 timeout, Boolean inSchema, SqlNotificationRequest notificationRequest, TdsParserStateObject stateObj, Boolean isCommandProc, Boolean sync, TaskCompletionSource`1 completion, Int32 startRpc, Int32 startParam)
       at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite, SqlDataReader ds)
       at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, TaskCompletionSource`1 completion, Int32 timeout, Task& task, Boolean asyncWrite)
       at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource`1 completion, String methodName, Boolean sendToPipe, Int32 timeout, Boolean asyncWrite)
       at System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
       at log4net.Appender.AdoNetAppender.SendBuffer(IDbTransaction dbTran, LoggingEvent[] events)
       at log4net.Appender.AdoNetAppender.SendBuffer(LoggingEvent[] events)
       at log4net.Appender.BufferingAppenderSkeleton.Append(LoggingEvent loggingEvent)
       at log4net.Appender.AppenderSkeleton.DoAppend(LoggingEvent loggingEvent)
    ClientConnectionId:a1efe1ac-6986-4a15-a233-7dcfee4ef60e
    Error Number:64,State:0,Class:20
    

    下面是我的log4net配置文件。

    <?xml version="1.0"?>
    <configuration>
        <log4net debug="true">
            <appender name="DebugAppender" type="log4net.Appender.DebugAppender">
                <layout type="log4net.Layout.PatternLayout">
                    <conversionPattern value="%-4timestamp [%thread] %-5level %logger - %message%newline"/>
                </layout>
            </appender>
            <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
                <layout type="log4net.Layout.PatternLayout">
                    <conversionPattern value="%-4timestamp [%thread] %-5level %logger - %message%newline"/>
                </layout>
            </appender>
    <appender name="RollingFileAppenderInfoErrorLogger" type="log4net.Appender.RollingFileAppender">
         <file value="D:\Halo\Logs\LoaderService.log" />
        <appendToFile value="true" />
        <rollingStyle value="Size" />
        <maxSizeRollBackups value="10" />
        <maximumFileSize value="10240KB" />
        <staticLogFileName value="true" />
        <countDirection value="1"/>
        <threshold value="INFO"/>
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%date %level %logger - %message%newline%newline" />
        </layout>
            <filter type="log4net.Filter.LevelRangeFilter">
          <param name="LevelMin" value="INFO"/>
          <param name="LevelMax" value="Error"/>
        </filter>
        </appender>
            <appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender">
                <bufferSize value="1"/>
                <usetransactions value="false"/>
                <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
                <connectionStringName value="HaloAutomationLog"/>
                <commandText value="INSERT INTO [HaloAMS].[Logging].[ApplicationLog] ([LogDate],[Thread],[LogLevel],[Logger],[LogMessage],[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="-1"/>
                    <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="INFO" />      
                <appender-ref ref="RollingFileAppenderInfoErrorLogger" />   
            <appender-ref ref="AdoNetAppender"/>
            </root>
        </log4net>
    </configuration>
    
    1 回复  |  直到 8 年前
        1
  •  1
  •   Peter    8 年前

    您可以添加

    <reconnectonerror value="True" />
    

    添加到appender配置或添加:

    ConnectRetryCount=X; //where x is the times you want to reconnection
    

    连接字符串