using InnovEnergy.Lib.Time.Unix; using Microsoft.Extensions.Logging; namespace InnovEnergy.App.SaliMax; public class CustomLogger(String logFilePath, Int64 maxFileSizeBytes, Int32 maxLogFileCount) : ILogger { private Int64 _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 file size and rotate the log file if necessary if (_CurrentFileSizeBytes + logMessage.Length >= maxFileSizeBytes) { RotateLogFile(); _CurrentFileSizeBytes = 0; } // Write the log message to the file File.AppendAllText(logFilePath, logMessage + Environment.NewLine); _CurrentFileSizeBytes += logMessage.Length; Console.WriteLine(logMessage); } private void RotateLogFile() { // 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()); // Rename the current log file with a timestamp var logFileBackupPath = Path.Combine(logFileDir, $"{logFileBaseName}_{UnixTime.Now}{logFileExt}"); File.Move(logFilePath, logFileBackupPath); } }