using LJLib.Tools.File;
using System;
using System.IO;
namespace LJLib.TextLog
{
internal class RequestLogger : ILogger
{
private readonly string _logDir;
private readonly object _syncRoot = new object();
public RequestLogger(string logDir = null)
{
// 默认目录为执行目录下的 log 文件夹
_logDir = logDir ?? Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "log");
if (!Directory.Exists(_logDir))
Directory.CreateDirectory(_logDir);
}
///
/// 获取今天的日志文件全路径
///
private string GetTodayLogFile()
{
string fileName = $"REQUEST_{DateTime.Now:yyyyMMdd}.log";
return Path.Combine(_logDir, fileName);
}
///
/// 写入日志
///
public void WriteLog(string msg)
{
try
{
lock (_syncRoot)
{
string filePath = GetTodayLogFile();
using (StreamWriter sw = new StreamWriter(filePath, true))
{
sw.WriteLine("====================================================================");
sw.WriteLine($"时间: {DateTime.Now:yyyy-MM-dd HH:mm:ss}");
sw.WriteLine("--------------------------------------------------------------------");
sw.WriteLine(msg);
sw.WriteLine("====================================================================");
sw.WriteLine();
}
// 清理过期日志(7天前的删除)
CleanupOldLogs();
}
}
catch
{
// 这里可考虑写到系统事件日志或忽略
}
}
///
/// 清理7天前的日志文件
///
private void CleanupOldLogs()
{
try
{
var files = Directory.GetFiles(_logDir, "REQUEST_*.log");
DateTime threshold = DateTime.Now.AddDays(-7);
foreach (var file in files)
{
string fileName = Path.GetFileNameWithoutExtension(file);
// 格式: REQUEST_yyyyMMdd
if (fileName.Length == "REQUEST_yyyyMMdd".Length &&
DateTime.TryParseExact(fileName.Replace("REQUEST_", ""),
"yyyyMMdd",
null,
System.Globalization.DateTimeStyles.None,
out DateTime logDate))
{
if (logDate < threshold.Date)
{
File.Delete(file);
}
}
}
}
catch
{
// 忽略清理异常
}
}
}
}