Click here to Skip to main content
Click here to Skip to main content

EZLogger - drop-dead easy logging

, 22 Mar 2007 CPOL
Rate this:
Please Sign up or sign in to vote.
A lightweight .NET logging component.

Introduction

EZLogger is an object that provides basic logging facilities to your application. EZLogger is a lightweight alternative to more feature-rich logging subsystems such as Log4Net and XQuiSoft Logging, both of which are excellent logging mechanisms. I wrote EZLogger because my application's logging needs were simple and I wanted to keep my app's footprint small. I hope you find EZLogger useful and welcome your suggestions.

Features

EZLogger writes log messages to a text file. The log file can be appended to, or a new one created when EZLogger is initialized. Log messages include a timestamp, severity and message text. Logging can be paused and resumed at any time. EZLogger's logging level (i.e. severities of interest) can be changed at run time to filter out unwanted messages. EZLogger is thread safe and can be used to log the activity of multiple threads.

EZLogger supports any combination of these severity levels:
  • Debug - trace and debug messages
  • Info - informational messages
  • Success - success messages
  • Warning - warnings
  • Error - error messages
  • Fatal - fatal errors
  • All - all messages

How to use EZLogger

You use EZLogger by creating a new instance, starting the logger, and calling one of the various logging methods. When you're done using the logger, you stop it as shown below.
  // Create and start the logger
  uint logLevels = (uint) EZLogger.Level.All;
  EZLogger logger =
    new EZLogger ("C:\\EZLoggerTester.log",  // log filename
                  false,                     // don't append
                  logLevels);                // log levels of interest
  bool bStatus = logger.Start();

  // Write log messages
  logger.Info ("An informational message");
  logger.Warning ("A warning");
  logger.Fatal ("A fatal error has occured");
  ...

  // Stop logging
  logger.Stop();

This code fragment produces the following log file.

12/4/2006 4:38:26 PM  I: An informational message
12/4/2006 4:38:26 PM  W: A warning
12/4/2006 4:38:26 PM  F: A fatal error has occur

The Pause() and Resume() methods can be used to temporarily suspend and restart logging.

  // Starting long, boring operation
  logger.Pause();
  performLongBoringOperation();
  logger.Resume();

The Levels property can be set to restrict logging to message severities of interest.

  // Only interested in errors and debug msgs
  logger.Levels = (uint) (EZLogger.Level.Error | EZLogger.Level.Debug);
  logger.Info ("...");   // won't be logged
  logger.Error ("...");  // will be logged

How it works

Starting EZLogger causes it to maintain a reference to a StreamWriter. Calls to log messages invoke StreamWriter.WriteLine() which causes formatted text to be written (and flushed) to the log file. Messages are filtered based on the object's LogLevel property. EZLogger's methods are synchronized by marking their bodies as critical sections (using the lock keyword).

Revision History

  • 22 Mar 2007
    Added GetMessageCount() method to retrieve the number of messages logged. Thanks to John Tibbits for the suggestion!
  • 5 Dec 2006
    Added explicit Resume() method instead of overloading the behavior of Start().
    Added ability to filter on arbitrary severity levels.
  • 4 Dec 2006
    Initial version.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

Share

About the Author

Ravi Bhavnani
Technical Lead
Canada Canada
Ravi Bhavnani is an ardent fan of Microsoft technologies who loves building Windows apps, especially PIMs, system utilities, and things that go bump on the Internet. During his career, Ravi has developed expert systems, desktop imaging apps, marketing automation software, EDA tools, a platform to help people find, analyze and understand information, trading software for institutional investors and advanced data visualization solutions. He currently works for a company that provides enterprise workforce management solutions to large clients.
 
His interests include the .NET framework, reasoning systems, financial analysis and algorithmic trading, NLP, HCI and UI design. Ravi holds a BS in Physics and Math and an MS in Computer Science and was a Microsoft MVP (C++ and C# in 2006 and 2007). He is also the co-inventor of 2 patents on software security and generating data visualization dashboards. His claim to fame is that he crafted CodeProject's "joke" forum post icon.
 
Ravi's biggest fear is that one day he might actually get a life, although the chances of that happening seem extremely remote.
Follow on   Google+   LinkedIn

Comments and Discussions

 
Questionmodify version - auto generate log filename by today date Pinmemberwoongs.bang13-Feb-13 19:57 
QuestionGreat and Simple! MDI Form Question... PinmemberTravis Hamera29-Dec-11 19:47 
AnswerRe: Great and Simple! MDI Form Question... PinmemberRavi Bhavnani30-Dec-11 2:35 
GeneralRe: Great and Simple! MDI Form Question... PinmemberTravis Hamera31-Dec-11 7:33 
GeneralRe: Great and Simple! MDI Form Question... PinmemberRavi Bhavnani31-Dec-11 7:46 
GeneralMy vote of 5 Pinmemberpolczym23-Oct-11 3:11 
GeneralRe: My vote of 5 PinmemberRavi Bhavnani26-Dec-11 9:31 
GeneralWindow CE PinmemberMember 23087665-Aug-10 5:01 
GeneralRe: Window CE PinmemberRavi Bhavnani5-Aug-10 6:46 
GeneralRe: Window CE PinmemberMember 23087665-Aug-10 14:57 
AnswerRe: Window CE PinmemberRavi Bhavnani5-Aug-10 15:28 
GeneralRe: Window CE PinmemberMember 23087665-Aug-10 18:38 
GeneralSimple and good Pinmembermannabaron29-May-07 7:38 
GeneralRe: Simple and good PinmemberRavi Bhavnani29-May-07 7:44 
QuestionRolling File Appender ? Pinmembermejax2-Apr-07 8:21 
AnswerRe: Rolling File Appender ? PinmemberRavi Bhavnani2-Apr-07 8:24 
QuestionRe: Rolling File Appender ? Pinmembermejax3-Apr-07 6:55 
AnswerRe: Rolling File Appender ? PinmemberRavi Bhavnani3-Apr-07 7:25 
QuestionLevel Assignment question Pinmemberarrivederci27-Mar-07 2:33 
AnswerRe: Level Assignment question PinmemberRavi Bhavnani27-Mar-07 2:40 
GeneralRe: Level Assignment question Pinmemberarrivederci27-Mar-07 3:08 
AnswerRe: Level Assignment question PinmemberRavi Bhavnani27-Mar-07 5:09 
arrivederci wrote:
What is the '|' doing?

The | operator is a bitwise (vs. logical) "or". See this[^] Wikipedia article.
 
arrivederci wrote:
How is it that you can assign multiple values to a single int?

You can, as long as the different values don't overlap (i.e. their bits don't overlap). This is called a bit mask[^] and is a commonly used trick to combine different, non-overlapping values in a single variable.
 
Hope this helps!
 
/ravi
 
This is your brain on Celcius
Home | Music | Articles | Freeware | Trips
ravib(at)ravib(dot)com

GeneralRe: Level Assignment question Pinmemberarrivederci27-Mar-07 7:44 
GeneralSuperb Pinmemberleonvd11-Dec-06 23:03 
GeneralRe: Superb PinmemberRavi Bhavnani12-Dec-06 2:05 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

| Advertise | Privacy | Mobile
Web01 | 2.8.141022.2 | Last Updated 22 Mar 2007
Article Copyright 2006 by Ravi Bhavnani
Everything else Copyright © CodeProject, 1999-2014
Terms of Service
Layout: fixed | fluid