When I work with mini C# projects, sometimes I need a logger to easily for me to debug the application during the run-time. So, I have wrote my own super simple logger class that I can simply use for my projects without using any other logger library.
SimpleLogger.cs
public class SimpleLogger
{
private readonly string datetimeFormat;
private readonly string logFilename;
/// <summary>
/// Initiate an instance of SimpleLogger class constructor.
/// If log file does not exist, it will be created automatically.
/// </summary>
public SimpleLogger()
{
datetimeFormat = "yyyy-MM-dd HH:mm:ss.fff";
logFilename = System.Reflection.Assembly.GetExecutingAssembly().GetName().Name + ".log";
// Log file header line
string logHeader = logFilename + " is created.";
if (!System.IO.File.Exists(logFilename))
{
WriteLine(System.DateTime.Now.ToString(datetimeFormat) + " " + logHeader, false);
}
}
/// <summary>
/// Log a DEBUG message
/// </summary>
/// <param name="text">Message</param>
public void Debug(string text)
{
WriteFormattedLog(LogLevel.DEBUG, text);
}
/// <summary>
/// Log an ERROR message
/// </summary>
/// <param name="text">Message</param>
public void Error(string text)
{
WriteFormattedLog(LogLevel.ERROR, text);
}
/// <summary>
/// Log a FATAL ERROR message
/// </summary>
/// <param name="text">Message</param>
public void Fatal(string text)
{
WriteFormattedLog(LogLevel.FATAL, text);
}
/// <summary>
/// Log an INFO message
/// </summary>
/// <param name="text">Message</param>
public void Info(string text)
{
WriteFormattedLog(LogLevel.INFO, text);
}
/// <summary>
/// Log a TRACE message
/// </summary>
/// <param name="text">Message</param>
public void Trace(string text)
{
WriteFormattedLog(LogLevel.TRACE, text);
}
/// <summary>
/// Log a WARNING message
/// </summary>
/// <param name="text">Message</param>
public void Warning(string text)
{
WriteFormattedLog(LogLevel.WARNING, text);
}
private void WriteFormattedLog(LogLevel level, string text)
{
string pretext;
switch (level)
{
case LogLevel.TRACE:
pretext = System.DateTime.Now.ToString(datetimeFormat) + " [TRACE] ";
break;
case LogLevel.INFO:
pretext = System.DateTime.Now.ToString(datetimeFormat) + " [INFO] ";
break;
case LogLevel.DEBUG:
pretext = System.DateTime.Now.ToString(datetimeFormat) + " [DEBUG] ";
break;
case LogLevel.WARNING:
pretext = System.DateTime.Now.ToString(datetimeFormat) + " [WARNING] ";
break;
case LogLevel.ERROR:
pretext = System.DateTime.Now.ToString(datetimeFormat) + " [ERROR] ";
break;
case LogLevel.FATAL:
pretext = System.DateTime.Now.ToString(datetimeFormat) + " [FATAL] ";
break;
default:
pretext = "";
break;
}
WriteLine(pretext + text);
}
private void WriteLine(string text, bool append = true)
{
try
{
using (System.IO.StreamWriter writer = new System.IO.StreamWriter(logFilename, append, System.Text.Encoding.UTF8))
{
if (text != "")
{
writer.WriteLine(text);
}
}
}
catch
{
throw;
}
}
[System.Flags]
private enum LogLevel
{
TRACE,
INFO,
DEBUG,
WARNING,
ERROR,
FATAL
}
}
Usage example
To get started, just initialize the SimpleLogger
class. Initializing the constructor will create a fresh new log file if the log file doesn’t yet exist. The log file will be created in the same folder with the application assembly file and the log file name will follow the executing assembly name. For example, let say the application filename is SimpleLoggerDemo.exe
, so the log file name would be SimpleLoggerDemo.log
.
Here’s the example code may look like:
namespace SimpleLoggerDemo
{
internal class Program
{
private static void Main(string[] args)
{
// Instantiate the class
var logger = new SimpleLogger(); // Will create a fresh new log file if it doesn't exist.
// To log Trace message
logger.Trace("--> Trace in message here...");
// To log Info message
logger.Info("Anything to info here...");
// To log Debug message
logger.Debug("Something to debug...");
// To log Warning message
logger.Warning("Anything to put as a warning log...");
// To log Error message
logger.Error("Error message...");
// To log Fatal error message
logger.Fatal("Fatal error message...");
}
}
}
Contributing
If you think you want to improve this logger class and make it more useful for other people, feel free to fork it or comment on my Gist. Any contribution will be welcomed and appreciated.