Files
EFC-DESK-V2/Classes/ProcessLogger.cs
2026-02-09 10:55:45 -07:00

99 lines
3.2 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace EFCDesk.Classes
{
public class ProcessLogger
{
private readonly string _logDirectory;
private readonly long _maxFileSizeBytes;
private readonly object _lock = new object();
private DateTime _currentLogDate;
private string _currentLogFilePath;
public ProcessLogger(string logDirectory = "Logs", string? logFileName = null, long maxFileSizeBytes = 1 * 1024 * 1024) // 1 MB
{
_logDirectory = logDirectory;
_maxFileSizeBytes = maxFileSizeBytes;
_currentLogDate = DateTime.Now;
if (!Directory.Exists(_logDirectory))
{
Directory.CreateDirectory(_logDirectory);
}
_currentLogFilePath = GetLogFilePath(_currentLogDate, logFileName);
}
public void LogInfo(string message) => Log("INFO", message);
public void LogWarning(string message) => Log("WARNING", message);
public void LogError(string message, Exception? ex = null)
{
string fullMessage = message;
if (ex != null)
{
fullMessage += $"{Environment.NewLine}Exception: {ex.Message}{Environment.NewLine}StackTrace: {ex.StackTrace}";
}
Log("ERROR", fullMessage);
}
private void Log(string level, string message)
{
string logEntry = $"[{DateTime.Now:yyyy-MM-dd HH:mm:ss}] [{level}] {message}";
lock (_lock)
{
RotateLogFileIfNeeded();
File.AppendAllText(_currentLogFilePath, logEntry + Environment.NewLine);
}
}
private void RotateLogFileIfNeeded()
{
DateTime now = DateTime.Now;
// Cambio de día: nuevo archivo
if (now.Date != _currentLogDate.Date)
{
_currentLogDate = now;
_currentLogFilePath = GetLogFilePath(_currentLogDate);
return;
}
// Excede tamaño máximo: crear nuevo archivo con sufijo incremental
if (File.Exists(_currentLogFilePath) &&
new FileInfo(_currentLogFilePath).Length >= _maxFileSizeBytes)
{
int index = 1;
string newPath;
do
{
newPath = GetLogFilePath(_currentLogDate, null, index++);
} while (File.Exists(newPath));
_currentLogFilePath = newPath;
}
}
private string GetLogFilePath(DateTime date, string? customName = null, int index = 0)
{
string datePart = date.ToString("yyyyMMdd");
string baseName = string.IsNullOrWhiteSpace(customName)
? $"log_{datePart}"
: Path.GetFileNameWithoutExtension(customName);
string extension = ".txt";
string fileName = index == 0
? $"{baseName}{extension}"
: $"{baseName}_{index}{extension}";
return Path.Combine(_logDirectory, fileName);
}
}
}