using InnovEnergy.Lib.Utils; using Microsoft.Extensions.Logging; namespace InnovEnergy.App.SaliMax; public class CustomLogger : ILogger { private readonly String _logFilePath; //private readonly Int64 _maxFileSizeBytes; private readonly Int32 _maxLogFileCount; private Int64 _currentFileSizeBytes; public CustomLogger(String logFilePath, Int32 maxLogFileCount) { _logFilePath = logFilePath; _maxLogFileCount = maxLogFileCount; _currentFileSizeBytes = File.Exists(logFilePath) ? new FileInfo(logFilePath).Length : 0; } public IDisposable? BeginScope(TState state) where TState : notnull => throw new NotImplementedException(); public Boolean IsEnabled(LogLevel logLevel) => true; // Enable logging for all levels public void Log(LogLevel logLevel, EventId eventId, TState state, Exception? exception, Func formatter) { var logMessage = formatter(state, exception!); // Check the log file count and delete the oldest file if necessary var logFileDir = Path.GetDirectoryName(_logFilePath)!; var logFileExt = Path.GetExtension(_logFilePath); var logFileBaseName = Path.GetFileNameWithoutExtension(_logFilePath); var logFiles = Directory .GetFiles(logFileDir, $"{logFileBaseName}_*{logFileExt}") .OrderBy(file => file) .ToList(); if (logFiles.Count >= _maxLogFileCount) { File.Delete(logFiles.First()); } var roundedUnixTimestamp = DateTime.Now.ToUnixTime() % 2 == 0 ? DateTime.Now.ToUnixTime() : DateTime.Now.ToUnixTime() + 1; var timestamp = "Timestamp;" + roundedUnixTimestamp + Environment.NewLine; var logFileBackupPath = Path.Combine(logFileDir, $"{logFileBaseName}_{DateTime.Now.ToUnixTime()}{logFileExt}"); File.AppendAllText(logFileBackupPath, timestamp + logMessage + Environment.NewLine); } }