Files
brick-framework/GameCore/Logging/FileLogger.cs

73 lines
1.7 KiB
C#

using System.Text;
using GameCore.Logging.Interfaces;
namespace GameCore.Logging;
public class FileLogger : ILogger, IDisposable
{
private readonly object _lock = new();
private readonly LogLevel _minLogLevel = LogLevel.Debug;
private readonly StreamWriter _streamWriter;
public FileLogger(string filePath, LogLevel minLogLevel = LogLevel.Debug)
{
_minLogLevel = minLogLevel;
var stream = new FileStream(filePath, FileMode.Append, FileAccess.Write, FileShare.Read);
_streamWriter = new StreamWriter(stream, Encoding.UTF8);
_streamWriter.AutoFlush = true;
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
public void Debug(string message)
{
Log(LogLevel.Debug, message);
}
public void Info(string message)
{
Log(LogLevel.Info, message);
}
public void Warn(string message)
{
Log(LogLevel.Warn, message);
}
public void Error(string message, Exception? ex = null)
{
Log(LogLevel.Error, message, ex);
}
protected virtual void Dispose(bool disposing)
{
if (disposing)
lock (_lock)
{
_streamWriter?.Dispose();
}
}
~FileLogger()
{
Dispose(false);
}
private void Log(LogLevel level, string message, Exception? ex = null)
{
if (level < _minLogLevel) return;
var logMessage = $"[{DateTime.Now:yyyy-MM-dd HH:mm:ss.ffff}] [{level.ToString().ToUpper()}] {message}";
lock (_lock)
{
_streamWriter.WriteLine(logMessage);
if (ex != null) _streamWriter.WriteLine(ex.ToString());
}
}
}