Click here to Skip to main content
15,867,453 members
Articles / Programming Languages / C#
Article

EZLogger - drop-dead easy logging

Rate me:
Please Sign up or sign in to vote.
4.65/5 (20 votes)
22 Mar 2007CPOL2 min read 83.9K   1.8K   94   25
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.
C#
// 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.

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

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

C#
// 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)


Written By
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 3 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.

Comments and Discussions

 
Questionmodify version - auto generate log filename by today date Pin
woongs.bang13-Feb-13 19:57
woongs.bang13-Feb-13 19:57 
QuestionGreat and Simple! MDI Form Question... Pin
Travis Hamera29-Dec-11 19:47
professionalTravis Hamera29-Dec-11 19:47 
AnswerRe: Great and Simple! MDI Form Question... Pin
Ravi Bhavnani30-Dec-11 2:35
professionalRavi Bhavnani30-Dec-11 2:35 
GeneralRe: Great and Simple! MDI Form Question... Pin
Travis Hamera31-Dec-11 7:33
professionalTravis Hamera31-Dec-11 7:33 
GeneralRe: Great and Simple! MDI Form Question... Pin
Ravi Bhavnani31-Dec-11 7:46
professionalRavi Bhavnani31-Dec-11 7:46 
GeneralMy vote of 5 Pin
polczym23-Oct-11 3:11
polczym23-Oct-11 3:11 
GeneralRe: My vote of 5 Pin
Ravi Bhavnani26-Dec-11 9:31
professionalRavi Bhavnani26-Dec-11 9:31 
GeneralWindow CE Pin
Member 23087665-Aug-10 5:01
Member 23087665-Aug-10 5:01 
GeneralRe: Window CE Pin
Ravi Bhavnani5-Aug-10 6:46
professionalRavi Bhavnani5-Aug-10 6:46 
GeneralRe: Window CE Pin
Member 23087665-Aug-10 14:57
Member 23087665-Aug-10 14:57 
AnswerRe: Window CE Pin
Ravi Bhavnani5-Aug-10 15:28
professionalRavi Bhavnani5-Aug-10 15:28 
GeneralRe: Window CE Pin
Member 23087665-Aug-10 18:38
Member 23087665-Aug-10 18:38 
GeneralSimple and good Pin
Wolfgang Mena-Bruhn29-May-07 7:38
Wolfgang Mena-Bruhn29-May-07 7:38 
GeneralRe: Simple and good Pin
Ravi Bhavnani29-May-07 7:44
professionalRavi Bhavnani29-May-07 7:44 
QuestionRolling File Appender ? Pin
mejax2-Apr-07 8:21
mejax2-Apr-07 8:21 
AnswerRe: Rolling File Appender ? Pin
Ravi Bhavnani2-Apr-07 8:24
professionalRavi Bhavnani2-Apr-07 8:24 
QuestionRe: Rolling File Appender ? Pin
mejax3-Apr-07 6:55
mejax3-Apr-07 6:55 
AnswerRe: Rolling File Appender ? Pin
Ravi Bhavnani3-Apr-07 7:25
professionalRavi Bhavnani3-Apr-07 7:25 
QuestionLevel Assignment question Pin
davidnr27-Mar-07 2:33
davidnr27-Mar-07 2:33 
AnswerRe: Level Assignment question Pin
Ravi Bhavnani27-Mar-07 2:40
professionalRavi Bhavnani27-Mar-07 2:40 
GeneralRe: Level Assignment question Pin
davidnr27-Mar-07 3:08
davidnr27-Mar-07 3:08 
AnswerRe: Level Assignment question Pin
Ravi Bhavnani27-Mar-07 5:09
professionalRavi 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 Pin
davidnr27-Mar-07 7:44
davidnr27-Mar-07 7:44 
GeneralSuperb Pin
leonvd11-Dec-06 23:03
leonvd11-Dec-06 23:03 
GeneralRe: Superb Pin
Ravi Bhavnani12-Dec-06 2:05
professionalRavi Bhavnani12-Dec-06 2:05 

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

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