// Author: Simon Gockner // Created: 2020-02-08 // Copyright(c) 2020 SimonG. All Rights Reserved. using System.IO; using System.Threading; using System.Threading.Tasks; using GBase.Logging.Interfaces; namespace GBase.Logging { /// /// 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 SemaphoreSlim(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() { _timer.Dispose(); await Flush(); _fileWriter.Dispose(); _lockObject.Dispose(); } } }