Ich weiß, dass dies eine schlechte Idee ist, aber ... Ich möchte log4net programmgesteuert von Grund auf ohne Konfigurationsdatei konfigurieren. Ich arbeite an einer einfachen Protokollierungsanwendung, die ich und mein Team für eine Reihe relativ kleiner Abteilungsanwendungen verwenden können, für die wir verantwortlich sind. Ich möchte, dass sie sich alle in derselben Datenbank anmelden. Die Protokollierungsanwendung ist nur ein Wrapper um log4net mit dem vorkonfigurierten AdoNetAppender.
Alle Anwendungen werden von ClickOnce bereitgestellt, was ein kleines Problem bei der Bereitstellung der Konfigurationsdatei darstellt. Wenn die Konfigurationsdatei Teil des Kernprojekts wäre, könnte ich ihre Eigenschaften für die Bereitstellung mit der Assembly festlegen. Da es jedoch Teil einer verknüpften Anwendung ist, habe ich nicht die Möglichkeit, es mit der Hauptanwendung bereitzustellen. (Wenn das nicht stimmt, lass es mich bitte wissen).
Wahrscheinlich, weil es eine schlechte Idee ist, scheint nicht viel Beispielcode für die programmgesteuerte Konfiguration von log4net von Grund auf verfügbar zu sein. Folgendes habe ich bisher.
Dim apndr As New AdoNetAppender()
apndr.CommandText = "INSERT INTO LOG_ENTRY (LOG_DTM, LOG_LEVEL, LOGGER, MESSAGE, PROGRAM, USER_ID, MACHINE, EXCEPTION) VALUES (@log_date, @log_level, @logger, @message, @program, @user, @machine, @exception)"
apndr.ConnectionString = connectionString
apndr.ConnectionType = "System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
apndr.CommandType = CommandType.Text
Dim logDate As New AdoNetAppenderParameter()
logDate.ParameterName = "@log_date"
logDate.DbType = DbType.DateTime
logDate.Layout = New RawTimeStampLayout()
apndr.AddParameter(logDate)
Dim logLevel As New AdoNetAppenderParameter()
logLevel.ParameterName = "@log_level"
'And so forth...
Nachdem apndr
ich alle Parameter für konfiguriert hatte , habe ich dies zuerst versucht ...
Dim hier As Hierarchy = DirectCast(LogManager.GetRepository(), Hierarchy)
hier.Root.AddAppender(apndr)
Es hat nicht funktioniert. Dann, als ein Schuss in die Dunkelheit, versuchte ich dies stattdessen.
BasicConfigurator.Configure(apndr)
Das hat auch nicht funktioniert. Hat jemand gute Referenzen, wie man log4net programmgesteuert von Grund auf ohne Konfigurationsdatei konfiguriert?
Antworten:
Eine Möglichkeit, wie ich dies in der Vergangenheit getan habe, besteht darin, die Konfigurationsdatei als eingebettete Ressource einzuschließen und nur log4net.Config.Configure (Stream) zu verwenden. .
Auf diese Weise konnte ich die mir vertraute Konfigurationssyntax verwenden und musste mir keine Sorgen um die Bereitstellung einer Datei machen.
quelle
Hier ist eine Beispielklasse, die die log4net-Konfiguration vollständig im Code erstellt. Ich sollte erwähnen, dass das Erstellen eines Loggers über eine statische Methode im Allgemeinen als schlecht angesehen wird, aber in meinem Kontext ist dies das, was ich wollte. Unabhängig davon können Sie den Code entsprechend Ihren Anforderungen zusammenstellen.
}}
quelle
hierarchy.Configured = true;
die der Trick für michPrägnantere Lösung:
Vergessen Sie nicht, die ActivateOptions- Methode aufzurufen :
quelle
ActivateOptions()
fehlen definitiv oder werden in den Dokumenten zumindest nicht ausreichend hervorgehoben.Als Jonathan sagt, ist die Verwendung einer Ressource eine gute Lösung.
Es ist insofern etwas einschränkend, als der Inhalt der eingebetteten Ressourcen beim Kompilieren korrigiert wird. Ich habe eine Protokollierungskomponente, die ein XmlDocument mit einer grundlegenden Log4Net-Konfiguration unter Verwendung von als appSettings definierten Variablen generiert (z. B. Dateiname für einen RollingFileAppender, Standardprotokollierungsstufe, möglicherweise Name der Verbindungszeichenfolge, wenn Sie einen AdoNetAppender verwenden möchten). Und dann rufe ich
log4net.Config.XmlConfigurator.Configure
auf, um Log4Net mit dem Stammelement des generierten XmlDocument zu konfigurieren.Anschließend können Administratoren die "Standard" -Konfiguration anpassen, indem sie einige appSettings (normalerweise Ebene, Dateiname, ...) ändern oder eine externe Konfigurationsdatei angeben, um mehr Kontrolle zu erhalten.
quelle
Ich kann im Code-Snippet der Frage nicht sagen, ob das "'Und so weiter ..." das sehr wichtige apndr.ActivateOptions () enthält, das in Todd Stouts Antwort angegeben ist. Ohne ActivateOptions () ist der Appender inaktiv und unternimmt nichts, was erklären könnte, warum er fehlschlägt.
quelle
Ein bisschen spät für die Party. Aber hier ist eine minimale Konfiguration, die für mich funktioniert hat.
Beispielklasse
Minimale log4net-Trace-Konfiguration (innerhalb des NUnit-Tests)
Druckt in den Trace-Listener
quelle
Dr. Netjes hat dies zum programmgesteuerten Einstellen des Verbindungsstrings:
quelle
// Ich habe drei Konfigurationsdateien als eingebettete Ressource eingebettet und greife folgendermaßen darauf zu:
quelle
Es ist seltsam, dass
BasicConfigurator.Configure(apndr)
das nicht funktioniert hat. In meinem Fall hat es seinen Job gemacht ... Aber hier ist die Antwort - Sie solltenhier.Configured = true;
(c # -Code) geschrieben haben, nachdem Sie alle Einstellungen abgeschlossen haben.quelle
Am Ende habe ich Folgendes verwendet:
http://www.mikebevers.be/blog/2010/09/log4net-custom-adonetappender/
Nach 4 Stunden mit der Konfiguration herumspielen und zunehmend frustrierter werden.
Hoffe es hilft jemandem.
quelle
Hier ist ein Beispiel dafür, wie Sie einen
AdoNetAdapter
vollständig in Code enthaltenen Code erstellen und verwenden können, ohne dass eineApp.config
Datei vorhanden ist (nicht einmal fürCommon.Logging
). Mach weiter, lösche es!Dies hat den zusätzlichen Vorteil, dass es gemäß den neuen Namenskonventionen , bei denen der Assemblyname jetzt die Version widerspiegelt, gegenüber Aktualisierungen stabil ist. (
Common.Logging.Log4Net1213
usw.)[SQL]
[Main]
[DbAppender]
[DbParameter]
[DbPatternLayout]
[DbExceptionLayout]
quelle
'Lösung für Vb.Net
quelle