91 lines
3.6 KiB
C#
Raw Normal View History

2026-01-29 08:39:56 +08:00
using System;
using System.IO;
using System.Text;
namespace YiDa_WinForm
{
/// <summary>
/// 日志辅助类确保线程安全正常写入文件路径清晰新增WinForm界面显示支持
/// </summary>
public static class LogHelper
{
// 日志根目录(基于程序运行目录,确保路径统一)
private static readonly string _logDirectory = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "log");
// 线程锁(保证多线程写入日志不冲突)
private static readonly object _lockObj = new object();
/// <summary>
/// 新增日志事件当有新日志生成时触发供MainForm订阅更新界面
/// </summary>
public static event Action<string> OnLogGenerated;
/// <summary>
/// 静态构造函数(初始化日志目录)
/// </summary>
static LogHelper()
{
try
{
if (!Directory.Exists(_logDirectory))
{
Directory.CreateDirectory(_logDirectory);
}
}
catch (Exception ex)
{
// 兜底输出到WinForm调试窗口可在VS的“输出”面板查看
System.Diagnostics.Debug.WriteLine($"【LogHelper初始化错误】创建日志目录失败{ex.ToString()}");
}
}
/// <summary>
/// 写入日志追加模式每日一个文件UTF-8编码新增界面日志推送
/// </summary>
/// <param name="content">日志内容</param>
public static void AppendLog(string content)
{
// 空内容直接返回,避免无效写入
if (string.IsNullOrWhiteSpace(content))
{
return;
}
try
{
// 1. 构造当日日志文件名(基于程序运行目录,路径绝对清晰)
string todayLogFileName = $"log_{DateTime.Now:yyyyMMdd}.txt";
string todayLogFileFullPath = Path.Combine(_logDirectory, todayLogFileName);
// 2. 拼接详细时间戳和日志内容,格式清晰便于排查
string logContent = $"[{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff}] {content}";
// 3. 加锁保证线程安全(防止多线程同时写入同一文件)
lock (_lockObj)
{
// 4. 以追加模式写入自动创建文件指定UTF-8无BOM编码
using (StreamWriter sw = new StreamWriter(
todayLogFileFullPath,
append: true,
encoding: new UTF8Encoding(false)))
{
sw.WriteLine(logContent);
// 强制刷新缓冲区,确保日志立即写入文件(避免缓存积压)
sw.Flush();
}
// 5. 输出到VS调试窗口保留原有功能
System.Diagnostics.Debug.WriteLine(logContent);
}
// 6. 新增触发日志事件推送日志内容到WinForm界面不放在lock内提高性能
OnLogGenerated?.Invoke(logContent);
}
catch (Exception ex)
{
// 兜底输出完整异常信息到VS调试窗口包含堆栈跟踪便于排查
System.Diagnostics.Debug.WriteLine($"【LogHelper写入错误】写入日志失败{ex.ToString()}");
}
}
}
}