2026-01-29 08:39:56 +08:00

91 lines
3.6 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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()}");
}
}
}
}