Log4Net avec AdoNetAppender - rien ne se passe
Description
J'ai un fichier de config comme une ressource dans mon assemblée et que vous souhaitez modifier la ConnectionString par programmation dans mon application.
- Je charger la configuration à l'aide log4net.Config.XmlConfigurator.Configure
.
J'ai quelques points d'arrêt et de voir que la configuration est chargée du succès et de la connectionstring est Data Source=localhost\SQLExpress;Initial Catalog=Log;Integrated Security=SSPI;
(SQLExpress locale).
Problème
Rien ne se passe, pas d'exception et aucune entrée de journal. Toutes les idées.
using (Stream stream = System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream("MyNamespace.Properties.log4net.config"))
{
//stream is NOT null
log4net.Config.XmlConfigurator.Configure(stream);
}
Hierarchy hier = LogManager.GetRepository() as Hierarchy;
if (hier != null)
{
//get ADONetAppender
var adoAppender = (AdoNetAppender)hier.GetAppenders().Where(appender => appender.Name.Equals("AdoNetAppender", StringComparison.InvariantCultureIgnoreCase)).FirstOrDefault();
if (adoAppender != null)
{
//update connectionstring
adoAppender.ConnectionString = configuration.GetConnectionString(ConnectionStringNames.Log).ConnectionString;
//refresh settings of appender
adoAppender.ActivateOptions();
}
}
ILog logger = LogManager.GetLogger("MyProject");
logger.Warn("Test");
contenu de la log4net.config fichier
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
</configSections>
<log4net>
<appender name="AdoNetAppender" type="log4net.Appender.ADONetAppender">
<bufferSize value="1" />
<connectionType value="System.Data.SqlClient.SqlConnection, System.Data,
Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<connectionString value="[we will set this automatically at runtime]" />
<commandText value="INSERT INTO Log ([Date],[Level],[Logger],[Message],[Exception])
VALUES (@log_date, @log_level, @logger, @message, @exception)" />
<parameter>
<parameterName value="@log_date" />
<dbType value="DateTime" />
<layout type="log4net.Layout.RawTimeStampLayout" />
</parameter>
<parameter>
<parameterName value="@log_level" />
<dbType value="String" />
<size value="50" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%p" />
</layout>
</parameter>
<parameter>
<parameterName value="@logger" />
<dbType value="String" />
<size value="255" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%c" />
</layout>
</parameter>
<parameter>
<parameterName value="@message" />
<dbType value="String" />
<size value="4000" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%m" />
</layout>
</parameter>
<parameter>
<parameterName value="@exception" />
<dbType value="String" />
<size value="2000" />
<layout type="log4net.Layout.ExceptionLayout" />
</parameter>
</appender>
<root>
<level value="ALL" />
<appender-ref ref="AdoNetAppender" />
</root>
</log4net>
</configuration>
- Total note, mais n'est-il pas beaucoup mieux pour le fichier de config d'exister côte à côte avec votre assemblée, plutôt que d'être cuit? Après tout, la raison principale c'est dans un fichier de config (et n'est pas définie dans le code C#) est de sorte que vous pouvez modifier sans avoir à recompiler votre application.
- En général, oui. Mais dans ma situation, j'ai besoin d'une ressource.
Vous devez vous connecter pour publier un commentaire.
Vous pouvez déboguer log4net par accrochage dans le log4net DebugAppender:
Ajouter un log4net application réglages de votre application.fichier de configuration:
Ajouter un debug appender dans le log4net config:
Ajouter l'appender à la log4net config racine:
Lorsque vous exécutez votre application, regardez dans la fenêtre de sortie de Visual Studio et vous devriez voir tous les internes de la journalisation pour log4net. Si non, alors le log4net fichier de config n'est jamais le chargement.
Modifier
Si vous pouvez utiliser une chaîne de connexion à partir de votre application.fichier de config, puis retirez la chaîne de connexion à partir de la log4net AdoNetAppender et il suffit d'appeler la chaîne de connexion par nom:
Warn
message.log4net.Config.XmlConfigurator.Configure
, après cela, pas d'autres messages qui vient.Voici quelques choses que j'ai essayé ça a fonctionné pour moi...
Je n'ai pas vu quoi que ce soit parce que mon
<appender-ref ref="AdoNetAppender" />
n'avait pas bien référencer mon<appender name="AdoNetAppender" ... />
dans le Web.config. Le " AdoNetAppender les noms doivent correspondre.Ajouté
<bufferSize value="1" />
à la<appender name="AdoNetAppender" />
section de la Web.configJ'ai créé un compte utilisateur avec un mot de passe sur le serveur SQL server au lieu d'utiliser l'authentification windows. Accordé l'accès de l'utilisateur à effectuer des sélections et des inserts sur la table
Dans Mondiale.asax.cs j'initialise log4net à l'aide de
log4net.Config.XmlConfigurator.Configure();
Dans mon code C# j'instancie un nouveau adoAppender objet et l'appel de
logger.Info("save to db");
La documentation sur le site web de Apache est utile aussi bien ...
http://logging.apache.org/log4net/release/config-examples.html#MS%20SQL%20Server
Espoir qui sauve quelqu'un certain temps et de frustration. Merci!