using InnovEnergy.Lib.Time.Unix; 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, Int64 maxFileSizeBytes, Int32 maxLogFileCount) { _LogFilePath = logFilePath; _MaxFileSizeBytes = maxFileSizeBytes; _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) { return 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; } 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); } }