저는 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에서 오류를 로그하지 못하는 이유는 무엇입니까?
행운이 있나요? 나는 똑같은 문제를 겪고있다. – Nick
별로 없습니다. 간단한 사용자 정의 로거를 위해 log4net을 완전히 삭제했습니다. –