2025-03-28 09:49:56 +08:00

60 lines
2.5 KiB
C#

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
namespace RunUpdater.Lib
{
public class LogHelper
{
public static string path = AppDomain.CurrentDomain.BaseDirectory;
/// <summary>
/// 读写锁,锁定文件写入权限,每个线程依次等待上个写入完成
/// </summary>
private static System.Threading.ReaderWriterLockSlim LogWriteLock = new System.Threading.ReaderWriterLockSlim();
private static Dictionary<long, long> lockDic = new Dictionary<long, long>();
public static void WriteServiceLog(string LogData)
{
LogData = DateTime.Now.ToLongTimeString() + ":" + LogData;
LogData = LogData.Replace("\r\n", Environment.NewLine);
string LogName = "日志_Send" + DateTime.Now.Year.ToString() + "-" + DateTime.Now.Month.ToString() + "-" + DateTime.Now.Day.ToString() + ".log";
WriteLogger(LogName, LogData);
}
public static void WriteLogger(string logFileName, string logData)
{
try
{
//设置读写锁为写入模式独占资源
//因写入模式的进入与释放在同一个代码块内,请保证在块内进入写入模式前不会触发异常,否则会因为进入与释放次数不符从而触发异常
//请勿长时间占用读写锁否则会导致其他线程饥饿。
LogWriteLock.EnterWriteLock();
string filename = Path.Combine(path, "log", logFileName);
//不存在目录则创建
if (!Directory.Exists(Path.Combine(path, "log")))
Directory.CreateDirectory(Path.Combine(path, "log"));
//不存在文件则创建
if (!File.Exists(filename))
{
File.Create(filename).Close();
}
using (FileStream file = new FileStream(filename, FileMode.Append, FileAccess.Write))
{
using (StreamWriter sw = new StreamWriter(file))
{
sw.WriteLine(logData + Environment.NewLine);
}
file.Close();
}
}
catch { }
finally
{
//退出写入模式,释放资源占用
//注意释放与进入次数相同否则会触发异常
LogWriteLock.ExitWriteLock();
}
}
}
}