由于iis的自动回收机制,不适用于ASP.NET程序

代码:

using System;
using System.Collections.Concurrent;
using System.Configuration;
using System.IO;
using System.Text;
using System.Threading;
using System.Threading.Tasks; namespace CommonDll
{
/// <summary>
/// 写日志类
/// </summary>
public class LogUtil
{
#region 字段
public static string path = ConfigurationManager.AppSettings["LogPath"];
public static int fileSize = * * ; //日志分隔文件大小
private static ConcurrentQueue<Tuple<string, DateTime>> queue = new ConcurrentQueue<Tuple<string, DateTime>>();
#endregion #region 构造函数
static LogUtil()
{
Task.Factory.StartNew(new Action(delegate()
{
StringBuilder log;
string path;
Tuple<string, DateTime> tuple;
string item; while (true)
{
log = new StringBuilder();
path = CreateLogPath(); while (queue.TryDequeue(out tuple))
{
item = string.Format(@"{0} {1}", tuple.Item2.ToString("yyyy-MM-dd HH:mm:ss.fff"), tuple.Item1);
log.AppendFormat("\r\n{0}", item);
} if (log.Length > ) WriteFile(log.ToString(, log.Length - ), path);
Thread.Sleep();
}
}));
}
#endregion #region 写文件
/// <summary>
/// 写文件
/// </summary>
public static void WriteFile(string log, string path)
{
try
{
if (!Directory.Exists(Path.GetDirectoryName(path)))
{
Directory.CreateDirectory(Path.GetDirectoryName(path));
} if (!File.Exists(path))
{
using (FileStream fs = new FileStream(path, FileMode.Create)) { fs.Close(); }
} using (FileStream fs = new FileStream(path, FileMode.Append, FileAccess.Write))
{
using (StreamWriter sw = new StreamWriter(fs))
{
sw.WriteLine(log);
sw.Flush();
}
fs.Close();
}
}
catch { }
}
#endregion #region 生成日志文件路径
/// <summary>
/// 生成日志文件路径
/// </summary>
public static string CreateLogPath()
{
int index = ;
string logPath;
bool bl = true;
do
{
index++;
logPath = Path.Combine(path, "Log" + DateTime.Now.ToString("yyyyMMdd") + (index == ? "" : "_" + index.ToString()) + ".txt");
if (File.Exists(logPath))
{
FileInfo fileInfo = new FileInfo(logPath);
if (fileInfo.Length < fileSize)
{
bl = false;
}
}
else
{
bl = false;
}
} while (bl); return logPath;
}
#endregion #region 写错误日志
/// <summary>
/// 写错误日志
/// </summary>
public static void LogError(string log)
{
queue.Enqueue(new Tuple<string, DateTime>("[Error] " + log, DateTime.Now));
}
#endregion #region 写操作日志
/// <summary>
/// 写操作日志
/// </summary>
public static void Log(string log)
{
queue.Enqueue(new Tuple<string, DateTime>("[Info] " + log, DateTime.Now));
}
#endregion }
}

测试代码:

private void button1_Click(object sender, EventArgs e)
{
int n = ;
DateTime dtStart = DateTime.Now;
for (int i = ; i <= n; i++)
{
ThreadPool.QueueUserWorkItem(new WaitCallback(delegate(object obj)
{
int j = (int)obj;
LogUtil.Log("测试" + j.ToString("")); if (j == n)
{
double sec = DateTime.Now.Subtract(dtStart).TotalSeconds;
MessageBox.Show(n + "条日志完成,耗时" + sec.ToString("0.000") + "秒");
}
}), i);
}
}

效果图:

C#写文本日志帮助类(支持多线程)改进版(不适用于ASP.NET程序)-LMLPHP

04-18 13:52