J'utilise l'appender AD4.NET de log4net pour consigner les messages du rôle de travail Azure dans l'instance SQL Azure (le diagnostic par défaut ne correspond tout simplement pas). Pour une raison quelconque, lors de l'exécution du worker dans dev fabric, la journalisation fonctionne. Cependant, lorsque l'instance est déployée dans le cloud (avec exactement la même configuration), les erreurs ne sont pas consignées.log4net ADO.NET Appender fonctionne sur Dev Fabric, mais échoue silencieusement sur Azure
Configuration se produit dans le code en utilisant ce fichier:
<?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 est initialisé avec les valeurs propres, lorsque l'environnement est Autofac IoC initalized (par démarrage du rôle). Le code ressemble à ceci:
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();
}
Le système d'exploitation Azure par défaut est utilisé. Les connexions SQL sont évidemment valides.
Quelqu'un peut-il, s'il vous plaît, penser à raison, pourquoi log4net enregistre les erreurs de la structure de développement, mais ne parvient pas à le faire à partir du système d'exploitation azure, en utilisant exactement les mêmes fichiers de configuration de service?
une chance avec cela? J'ai le même problème. – Nick
Pas beaucoup. Supprimé complètement log4net en faveur d'un simple enregistreur personnalisé. –