91 lines
3.6 KiB
C#
91 lines
3.6 KiB
C#
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()}");
|
||
}
|
||
}
|
||
}
|
||
} |