Laden...

log4net Konfiguration mit Attributen

Erstellt von fluxy vor 8 Jahren Letzter Beitrag vor 8 Jahren 2.500 Views
F
fluxy Themenstarter:in
183 Beiträge seit 2009
vor 8 Jahren
log4net Konfiguration mit Attributen

Moin Community,

ich habe das Problem eigentlich schon lange, aber ich habe jetzt mal beschlossen der Sache auf den Grund zu gehen. Es geht um log4net und die Konfiguration dieser. Ich habe in einem Projekt jetzt wieder log4net eingebunden, um nhibernate zu debuggen. Wie dem auch sei, ich habe gestern log4net über NuGet bezogen (Aktuelle Version ist 2.0.4) und losgelegt.

Als Referenz nehme ich diesen Artikel: Log4Net und NHibernate

Das ist zwar ein Hibernate-Artikel, aber eigentlich ist das auch egal, das Pattern sollte ziemlich identisch sein und dem was ihr vielleicht von log4net aus anderen Quellen kennt. Die Config habe ich übernommen so wie sie dort ist und sicherheitshaltber nicht nur im Testprojekt sondern auch im NHibernate-Projekt in Form einer app.config bereitgestellt.

Jetzt ist die Erwartungshaltung, dass nur eine Attributierung durchgeführt wird, und dadurch log4net gestartet wird. Ich habe erst, wie immer beschrieben, das Attribut über einen zufällig ausgewählten Namespace in der Testassembly und NHibernate Assembly getestet, nachdem das nicht funktioniert hat, habe ich das Attribut in die AssemblyInfo.cs verschoben (google hat mir da einen Artikel zu Tage befördert). Allerdings hilf dies alles nix.


[assembly: log4net.Config.XmlConfigurator(Watch = true)]

Auf jedenfall wird kein Logfile erzeugt. Ich hatte das Problem wie gesagt schon in der Vergangenheit öfters, die Lösung war dann den XmlConfigurator von Hand irgendwo (z.B. im TestInitialize) zu erzeugen. Dann funktionierte das logging auch (das habe ich jetzt allerdings nicht ausprobiert). Letztendlich würde das bedeuten, dass das Attribut nicht ausgewertet wird, und deshalb der Log4Net Initialisierungsprozess nicht gestartet wird.

Aber kann mir jemand sagen warum? Ich würde das gerne verstehen.

Viele Grüße,
fluxy

16.834 Beiträge seit 2008
vor 8 Jahren

Sei Dir nur bewusst, dass die Entwicklung von log4net eingestellt wurde.

C
40 Beiträge seit 2011
vor 8 Jahren

Hallo fluxy,

vor dem Problem stand ich auch, als ich eine Windows Forms Anwendung zu WPF migriert hatte. Unter Windows Forms hatte ich noch das Attribut an der main-Methode gesetzt.
Auch bei dir sollte die Ursache die sein, dass die Konfiguration zu spät geladen wird:

Therefore it is imperative to make a logging call as early as possible during the application start-up, and certainly before any external assemblies have been loaded and invoked. Quelle: Apache log4net

Wo stammt das denn her? Ich nutze log4net selber und kann diese Behauptung weder durch die Projektseite noch nuget bestätigt sehen.

Gruß Chris

16.834 Beiträge seit 2008
vor 8 Jahren

Oh wow, tatsächlich nach 2 Jahren ein neues Release von log4net.. sorry, das is für mich nicht wirklich aktiv.

F
fluxy Themenstarter:in
183 Beiträge seit 2009
vor 8 Jahren

Moin,

ja gut es ist eine Logging-Bibliothek. Wahrscheinlich gut es da ja auch nicht mehr so viel zu tun. Aber ich frag mal so:

Alternative?!

Grundsätzlich muss ich aber sagen, ich war mit Log4Net immer zufrieden - sobald die Konfiguration lief gab es keine Probleme. Das Einrichten ist nervig, aber wenns einmal läuft, dann lief es immer. Aber zurück zu meinem Problem, ich denke das entscheidene ist dies hier (passt auch zu dem guten Hinweis):

A simple call to LogManager.GetLogger will cause the attributes on the calling assembly to be read and processed. Therefore it is imperative to make a logging call as early as possible during the application start-up, and certainly before any external assemblies have been loaded and invoked.

Heisst, LogManager.GetLogger interpretiert das Attribute. Ich habe einige Logs eingebaut (ausserhalb von NHibernate), das funktioniert soweit. Ich habe allerdings noch ein anderes Problem, was vermutlich mit meiner Config zu tun haben wird. Dazu muss ich sagen ich nutze die folgende Kombination:

Visual Studio 2015 + Resharper 10 + NUnit 10

Und zwar ist das Problem, dass irgendwie die Ausgaben teilweile auf dem falschen Output landen (zumindest gefühlt). Und zwar habe ich 2 Appender, console und rolling file. Ich habe den Root Logger und 2 weitere Logger für NHibernate). Nun landen meine Logs (die ich selbst aufrufe im Logfile und im Testoutput) und die NHibernate Logs in der Konsole, aber nicht im Logfile und auch nicht im Testoutput). Könnt ihr mal über die Config schauen ob ich etwas total doofes gemacht habe?


<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <!-- Others sections -->
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" />
  </configSections>

  <!-- This section contains the log4net configuration settings -->
  <log4net debug="false">

    <!-- Define some output appenders -->
    <appender name="trace"
          type="log4net.Appender.TraceAppender, log4net">
      <layout type="log4net.Layout.PatternLayout,log4net">
        <param name="ConversionPattern"
             value="%d{ABSOLUTE} %-5p %c{1}:%L - %m%n" />
      </layout>
    </appender>

    <appender name="console"
          type="log4net.Appender.ConsoleAppender, log4net">
      <layout type="log4net.Layout.PatternLayout,log4net">
        <param name="ConversionPattern"
             value="%d{ABSOLUTE} %-5p %c{1}:%L - %m%n" />
      </layout>
    </appender>

    <appender name="rollingFile"
          type="log4net.Appender.RollingFileAppender,log4net" >

      <param name="File" value="nhibernate.log" />
      <param name="AppendToFile" value="true" />
      <param name="RollingStyle" value="Date" />
      <param name="DatePattern" value="yyyy.MM.dd" />
      <param name="StaticLogFileName" value="true" />

      <layout type="log4net.Layout.PatternLayout,log4net">
        <param name="ConversionPattern"
          value="%d [%t] %-5p %c - %m%n" />
      </layout>
    </appender>

    <!-- Setup the root category, add the appenders and set the default priority -->
    <root>
      <priority value="ALL" />
      <appender-ref ref="console" />
      <appender-ref ref="rollingFile" />
    </root>
    
    <logger name="NHibernate">
      <level value="ALL" />
      <appender-ref ref="console" />
      <appender-ref ref="rollingFile" />
    </logger>

    <logger name="NHibernate.SQL">
      <level value="ALL" />
      <appender-ref ref="console" />
      <appender-ref ref="rollingFile" />
    </logger>
  </log4net>
</configuration>

vg

2.207 Beiträge seit 2011
vor 8 Jahren

Aber ich frag mal so:

Alternative?!

Hallo fluxy,

es gibt etliche alternativen zum Logging. .NET Logging Tools and Libraries bietet eine Liste davon. Inwieweit die im Einzelnen so umfangreich und zuverlässig sind wie log4net weiss ich nicht. Ich habe früher jedenfalls log4net verwendet und bin mittlerweile auf nLog umgestiegen.

Gruss

Coffeebean

16.834 Beiträge seit 2008
vor 8 Jahren

Im generellen Vergleich denke ich gibt es nur nLog. Es ist auch das aktuell aktivste Logging-Projekt für C#.
Beide Bibliotheken sind meiner Meinung aber nur bis zu einer gewissen Anwendungsgröße nützlich.