2010-05-18 6 views
6

저는 log4net appender ADO.NET을 사용하여 Azure Worker Role의 메시지를 SQL Azure 인스턴스에 기록합니다 (기본 진단은 적합하지 않습니다). 웬일인지, dev 패브릭에서 작업자를 실행하는 동안 로깅이 작동합니다. 그러나 인스턴스가 클라우드에 배치 될 때 (정확하게 동일한 구성으로) 오류가 기록되지 않습니다.log4net ADO.NET Appender는 Dev Fabric에서 작동하지만 Azure에서 자동으로 실패 함

구성이 파일을 이용하여 코드를 발생 :

<?xml version="1.0" encoding="utf-8" ?> 
<log4net> 
    <renderer renderingClass="{ExceptionRenderer}" renderedClass="System.Exception" /> 
    <appender name="TraceAppender" type="log4net.Appender.TraceAppender"> 
    <layout type="log4net.Layout.PatternLayout"> 
     <!--<conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />--> 
     <conversionPattern value="%message%newline" /> 
    </layout> 
    </appender> 
    <appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender"> 
    <bufferSize value="3" /> 
    <connectionType value="{ConnectionType}" /> 
    <connectionString value="{ConnectionString}" /> 
    <commandText value="INSERT INTO Salescast_Log ([Date],[Thread],[Version],[Level],[Logger],[Message],[Exception]) VALUES (@log_date, @thread, '{Version}',@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="4000" /> 
     <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%message" /> 
     </layout> 
    </parameter> 
    <parameter> 
     <parameterName value="@exception" /> 
     <dbType value="String" /> 
     <size value="4000" /> 
     <layout type="{ExceptionLayoutType}" /> 
    </parameter> 
    <filter type="log4net.Filter.LevelRangeFilter"> 
     <levelMin value="ERROR" /> 
     <levelMax value="FATAL" /> 
    </filter> 
    </appender> 
    <root> 
    <level value="DEBUG" /> 
    <appender-ref ref="TraceAppender" /> 
    <appender-ref ref="AdoNetAppender" /> 
    </root> 
</log4net> 

log4net은 Autofac IOC의 환경이 (역할 시작 PER) initalized되는 적절한 값으로 초기화된다. 코드는 다음과 같습니다.

static ILogProvider BuildProvider(IComponentContext context) 
{ 
    var connection = context 
    .Resolve<IProvideBusSettings>() 
    .GetString("SqlConnection") 
    .ExposeException("Failed to get SQL string for logging"); 

    var xml = Properties.Resources.Logging 
    .Replace("{ConnectionType}", typeof(SqlConnection).AssemblyQualifiedName) 
    .Replace("{ConnectionString}", connection) 
    .Replace("{ExceptionLayoutType}", typeof(LoggingTrimmedExceptionLayout).AssemblyQualifiedName) 
    .Replace("{ExceptionRenderer}", typeof(LoggingExceptionRenderer).AssemblyQualifiedName) 
    .Replace("{Version}", SystemDescriptor.Default.Version.ToString()); 

    var doc = new XmlDocument(); 
    doc.LoadXml(xml); 
    XmlConfigurator.Configure(doc.DocumentElement); 
    return new LoggingProvider(); 
} 

기본값 Azure OS가 사용됩니다. SQL 연결은 분명히 유효합니다.

log4net이 dev 패브릭에서 오류를 기록하는 이유는 누구입니까? 이유는 무엇입니까?하지만 정확히 동일한 서비스 구성 파일을 사용하여 하늘색 OS에서 오류를 로그하지 못하는 이유는 무엇입니까?

+0

행운이 있나요? 나는 똑같은 문제를 겪고있다. – Nick

+0

별로 없습니다. 간단한 사용자 정의 로거를 위해 log4net을 완전히 삭제했습니다. –

답변

0

SQL Azure 방화벽 규칙에 문제가있을 수 있습니까?

+0

불행히도, 아니오. 동일한 SQL Azure 연결 문자열은 dev fabric과 azure 시나리오에서 문제없이 동일한 작업자 역할 내의 CQRS 명령 처리기에서 사용됩니다. –

3

이 문제에 대한 리드가있을 수 있습니다. here에 설명 된대로 log4net에 대한 내부 로깅을 활성화했습니다. 로깅은 잠시 동안 작동하고 멈출 것입니다. log4net 로그의 원인은 다음과 같습니다.

log4net:ERROR [log4netDbAppender] Failed in DoAppend System.Data.SqlClient.SqlException (0x80131904): A transport-level error has occurred when sending the request to the server. (provider: TCP Provider, error: 0 - An established connection was aborted by the software in your host machine.) at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection) at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning() at System.Data.SqlClient.TdsParserStateObject.WriteSni() at System.Data.SqlClient.TdsParserStateObject.ExecuteFlush() at System.Data.SqlClient.TdsParser.TdsExecuteRPC(_SqlRPC[] rpcArray, Int32 timeout, Boolean inSchema, SqlNotificationRequest notificationRequest, TdsParserStateObject stateObj, Boolean isCommandProc) at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async) at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result) at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(DbAsyncResult result, String methodName, Boolean sendToPipe) 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)

이 오류가 발생하면 log4net 시도가 ​​중지 된 것 같습니다. This 문서에는 일반적으로 이러한 유형의 예외를 처리하는 방법이 설명되어 있으며 AdoNetAppender를 확장하는 데 사용할 수 있습니다.

EDIT AdoNetAppender.ReconnectOnError = true로 설정하는 것이 도움이되는 것은 기본적으로 false입니다.

13

나는 이것에 부딪쳤다. 그리고 나는 그것을 이해하려고 노력하고있는 더 좋은 일부를 보내었다. SQL Azure에는 테이블에 클러스터 된 인덱스가 필요하다는 사실이 드러났습니다. 로그 테이블을 만들기 위해 log4net에서 제공하는 예제 SQL 코드에는 SQL Azure의 요구 사항 인 클러스터 된 인덱스가 없습니다. 클러스터 된 인덱스가없는 한 테이블에 데이터를 추가하는 작업은 실패합니다 (이 작업이 작성된 시점).

SQL Azure에 연결되어있는 동안 SQL Server Management Studio를 사용하여 수동 삽입 명령문을 실행하면이 문제가 발생하면 즉시 알려줍니다. 그렇다면 다음 SQL을 실행하여 테이블에 클러스터 된 인덱스를 추가 한 다음 (log4net에서 직접 SQL을 사용했다고 가정) 다시 시도하십시오.

CREATE UNIQUE CLUSTERED INDEX PK_Log ON [Log] 
    ([Id]) 
GO 
+0

수동 삽입을 제안 해 주셔서 감사합니다. –

관련 문제