// Author: Gockner, Simon
// Created: 2019-09-26
// Copyright(c) 2019 SimonG. All Rights Reserved.
using System.IO;
using System.Threading;
using System.Threading.Tasks;
using Lib.Logging.Interfaces;
using Lib.Logging.Loggers.Interfaces;
namespace Lib.Logging.Loggers
{
///
/// An that writes log messages to a set file
///
public class FileLogger : IFileLogger
{
private readonly StreamWriter _fileWriter;
private readonly Timer _timer;
private readonly SemaphoreSlim _lockObject = new(1);
///
/// Constructor for
///
/// The directory of the LogFile
/// The path of the LogFile
public FileLogger(string filePath, string fileName)
{
Directory.CreateDirectory(filePath);
_fileWriter = new StreamWriter(Path.Combine(filePath, fileName), true);
_timer = new Timer(TimerCallback, null, 0, 1000);
}
///
/// Write the given to the file
///
/// The
public async Task Write(ILogMessage message)
{
await _lockObject.WaitAsync();
try
{
await _fileWriter.WriteAsync(message.ToString());
}
finally
{
_lockObject.Release();
}
}
private async void TimerCallback(object? state) => await Flush();
private async Task Flush()
{
await _lockObject.WaitAsync();
try
{
await _fileWriter.FlushAsync();
}
finally
{
_lockObject.Release();
}
}
///
/// the
///
public async ValueTask DisposeAsync()
{
await _timer.DisposeAsync();
await Flush();
await _fileWriter.DisposeAsync();
_lockObject.Dispose();
}
}
}