Over Atos Origin
Contact
Diensten
Nieuws
Home
Feedback  |  Atos Origin.com  |  Syndicatie
Syndicatie
 
Links
Archief
Meer over de bloggers
Onderwerpen
Alle onderwerpen
Agile
Algemeen
Architectuur
Besturingssystemen
Bpm
Business intelligence
Business proces design
Cloud computing
Eai
Governance
Ibm
Integratie
It consultancy
Java
Microsoft
Nljug
Open source
Oracle
Process standaarden
Project management
Requirements engineering
Rich internet applications
Saas
Security
Sharepoint
Soa
Testing
Virtualisatie
Xml

(B)loggen met Log4Net
Geplaatst op 13 January 2009, 13:26 door Sander van de Velde in microsoft, open source, agile

Enige tijd gelezen heb ik een stukje geschreven over het loggen met het standaard logging framework van .Net. Op zich geeft dat al heel veel flexibiliteit bij het loggen maar het kan natuurlijk altijd beter...

Sinds kort passen wij Log4Net toe. Log4Net is een opensource project en is te downloaden op http://logging.apache.org/log4net/. Log4Net is afgeleid van het log4j project en wordt gepubliceerd met de Apache license agreement.


De huidige release is al weer enkele jaren oud (maart 2006) en gebaseerd op .Net 2.0 en het werkt prima.

Log van origami

De grootste voordelen voor ons ten opzichte van het standaard .Net logging framework zijn nu:
  • Betere granulatie (Nu ook Debug en Warning mogelijkheden) en combinaties van loggers en appenders mogelijk
  • Loggen naar een aparte eventlog ipv. de Application eventlog
  • De rolling file heeft meer opties (per dag, per filegrootte, combinaties)

 

Er zijn nog meer logging mogelijkheden. De lijst van mogelijkheden is echt lang:

 

Type

Description

log4net.Appender.AdoNetAppender

Writes logging events to a database using either prepared statements or stored procedures.

log4net.Appender.AnsiColorTerminalAppender

Writes color highlighted logging events to a an ANSI terminal window.

log4net.Appender.AspNetTraceAppender

Writes logging events to the ASP trace context. These can then be rendered at the end of the ASP page or on the ASP trace page.

log4net.Appender.BufferingForwardingAppender

Buffers logging events before forwarding them to child appenders.

log4net.Appender.ColoredConsoleAppender

Writes logging events to the application's Console. The events may go to either the standard our stream or the standard error stream. The events may have configurable text and background colors defined for each level.

log4net.Appender.ConsoleAppender

Writes logging events to the application's Console. The events may go to either the standard our stream or the standard error stream.

log4net.Appender.EventLogAppender

Writes logging events to the Windows Event Log.

log4net.Appender.FileAppender

Writes logging events to a file in the file system.

log4net.Appender.ForwardingAppender

Forwards logging events to child appenders.

log4net.LocalSyslogAppender

Writes logging events to the local syslog service (UNIX only).

log4net.Appender.MemoryAppender

Stores logging events in an in memory buffer.

log4net.Appender.NetSendAppender

Writes logging events to the Windows Messenger service. These messages are displayed in a dialog on a users terminal.

log4net.Appender.OutputDebugStringAppender

Writes logging events to the debugger. If the application has no debugger, the system debugger displays the string. If the application has no debugger and the system debugger is not active, the message is ignored.

log4net.Appender.RemoteSyslogAppender

Writes logging events to a remote syslog service using UDP networking.

log4net.Appender.RemotingAppender

Writes logging events to a remoting sink using .NET remoting.

log4net.Appender.RollingFileAppender

Writes logging events to a file in the file system. The RollingFileAppender can be configured to log to multiple files based upon date or file size constraints.

log4net.Appender.SmtpAppender

Sends logging events to an email address.

log4net.Appender.SmtpPickupDirAppender

Writes SMTP messages as files into a pickup directory. These files can then be read and sent by an SMTP agent such as the IIS SMTP agent.

log4net.Appender.TelnetAppender

Clients connect via Telnet to receive logging events.

log4net.Appender.TraceAppender

Writes logging events to the .NET trace system.

log4net.Appender.UdpAppender

Sends logging events as connectionless UDP datagrams to a remote host or a multicast group using a UdpClient.

 
 

Zelf zijn we eigenlijk alleen geïnteresseerd in log4net.Appender.RollingFileAppender en de log4net.Appender.EventLogAppender vanwege bovenstaande voordelen.


 

Hoe dus te beginnen:

  • Haal de laatste release (versie 1.2.10) van http://logging.apache.org/log4net/download.html. Pak de zip ergens uit en onthoud de locatie.
  • Start daarna in Visual Studio een nieuwe console applicatie en maak een referentie naar \log4net-1.2.10\bin\net\2.0\debug\ log4net.dll
  • Schrijf de volgende code en roep de log methode aan in de Main methode:

 

  

using log4net;

using log4net.Config;

 

protected static readonly ILog logger = LogManager.GetLogger(typeof(Program));

 

public static void Log()

{

  XmlConfigurator.Configure();

 

  logger.Debug("Debug melding REGEL 1/2"

                             + Environment.NewLine

                             + "Debug melding REGEL 1/2");

  logger.Info("Info melding");

  logger.Warn("Waarschuwing melding");

  logger.Error("FOUT melding");

  logger.Fatal("Fatale melding");

}


 

  • Voeg een Application Configuration File (app.config) toe aan de applicatie en laat deze er zo uitzien:


 

<?xml version="1.0" encoding="utf-8" ?>

<configuration>

  <configSections>

    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,Log4net"/>

  </configSections>

  <log4net>

    <root>

          <level value="DEBUG" /> <!-- Overall filter min level -->

          <appender-ref ref="SizeLogFileAppender" />

          <appender-ref ref="DateLogFileAppender" />

          <appender-ref ref="EventLogAppender" />

    </root>

 

    <appender name="SizeLogFileAppender" type="log4net.Appender.RollingFileAppender" >

          <param name="File" value="C:\temp\rollingsizelogfile.txt" />

          <param name="AppendToFile" value="true" />

          <rollingStyle value="Date" />

          <maxSizeRollBackups value="10" />

          <maximumFileSize value="100KB" /> <!-- "10MB" "1GB" -->

          <staticLogFileName value="true" />

          <layout type="log4net.Layout.PatternLayout">

                <param name="ConversionPattern" value="%-5p%d{yyyy-MM-dd hh:mm:ss} - %m%n" />

          </layout>

    </appender>

 

    <appender name="DateLogFileAppender" type="log4net.Appender.RollingFileAppender">

          <file value="C:\temp\rollingdatelogfile.txt" />

          <appendToFile value="true" />

          <rollingStyle value="Date" />

          <datePattern value="mm" /> <!-- "yyyyMMdd-HHmm" -->

          <layout type="log4net.Layout.PatternLayout">

            <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />

          </layout>

          <filter type="log4net.Filter.LevelRangeFilter">

            <levelMin value="WARN" />

            <levelMax value="ERROR" />

          </filter>

    </appender>

 

    <appender name="EventLogAppender" type="log4net.Appender.EventLogAppender" >

      <!--<ApplicationName value="MyApp" />-->

      <LogName value="MijnLog" />

      <layout type="log4net.Layout.PatternLayout">

        <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />

      </layout>

    </appender>

 

  </log4net>

</configuration>


 

Hier wordt verwezen naar c:\temp. Deze map zal eventueel aangemaakt worden. Als je nu de applicatie draait dan worden de logmeldingen in totaal drie keer opgeslagen. Dit is namelijk beschreven in de root - appender-ref. Dat daar een level op DEBUG wordt gezet is overigens overbodig (want standaard zo ingesteld) maar hiermee kun je forceren dat je bv. Alleen maar waarschuwingen en erger wilt laten loggen. Vervang DEBUG dan door WARN. Het is dus een filter level geldend voor alle appenders.

 

De SizeLogFileAppender schrijft voor dat naar een bestand wordt geschreven waarbij het bestand niet groter dan 100kb mag worden. Normaal zal de limiet veel hoger liggen maar dit is ter demonstratie. Bij overschrijding wordt de naam uitgebreid met een uniek opeenvolgend getal. Dit getal wordt overigens achteraan in de extensie gezet...

 

De DateLogFileAppender beschrijft dat afhankelijk van een bepaald overlappend datumformaat, logmeldingen bij elkaar in één bestand geplaatst worden. Zo wordt hier alle logmeldingen, aangemaakt in dezelfde minuut, bij elkaar gestopt. Als het formaat "yyyyMMdd" was, zou per dag een apart bestand aangemaakt worden. Overigens is het loggen ook nog eens gefilterd op alleen meldingen van het type waarschuwing of foutmelding. Andere typen meldingen worden niet toegevoegd.

 

Als laatste schrijft de EventLogAppender voor dat ook naar de Eventlog wordt geschreven. Alle logmeldingen worden hierbij niet naar de Application log maar naar een aparte MijnLog geschreven. Let er op dat LogName niet samen met ApplicationName wordt gebruikt. In dat geval wordt wel de log aangemaakt maar de meldingen komen toch in de Application log.

 

In dit voorbeeld wordt geen gebruik gemaakt van logger elementen. Dit geeft mogelijkheid om appenders abstracter te maken vanuit de code. Hier wordt vanuit de code gewoon de standaard logger aangeroepen (LogManager.GetLogger).

 

Bovenstaande geeft een aardige aanzet om met Log4Net te kunnen beginnen. Er is natuurlijk nog veel meer mogelijk maar hier hebben wij voorlopig voldoende aan. Kijk voor meer informatie op http://logging.apache.org/log4net/release/features.html




Share this | 1172 keer bekeken | 3 reacties
Reacties Syndicatie en RSS

Hans ten Berge reageert, op January 14, 2009 om 13:39 (GMT +01:00):

Heel interessant, kan me voorstellen dat niet iedereen gebruik maakt omdat men het nooit heeft gebruikt.



developerslog.net reageert, op March 10, 2010 om 11:28 (GMT +01:00):

ipv:

protected static readonly ILog logger = LogManager.GetLogger(typeof(Program));

Kun je ook onderstaande regel code gebruiken:


private static readonly log4net.ILog Log = log4net.LogManager.GetLogger (System.Reflection.MethodBase.GetCurrentMethod ().DeclaringType);

Op deze manier logt log4net automatisch met de juiste namespace, dit voorkomt logmeldingen in je log met verkeerde namespaces door copy paste errors

 



Sander van de Velde reageert, op March 10, 2010 om 13:48 (GMT +01:00):

developerslog.net, Bedankt voor de welkome aanvulling!


Reageer
 
 
Top artikelen
  • J-Spring 2009:Hop on board the Java Troubleshooting Platform
  • Softwaredocumentatie met Sandcastle
  • Agile Springboard
  • Blik op kwaliteit door middel van Six Sigma
  • Developers zijn kikkers
Recente reacties
  • IDC voorspelt dat SaaS mainstream wordt binnen paar ...
  • PrimeFaces is nauwelijks nog bekend terwijl het veel ...
  • Dank!
  • Het bijwerken is met behulp van if(contains()) remove() ...
  • Alleen keuren de bovengenoemde alternatieven duplicate entries af ...
  • Terms of use
  • Legal