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