111,092
社区成员




public class Logger
{
private const int LogFileSizeLimit = 1024000;
private const string LogFileName = "log";
private static Logger instance;
private readonly string logDirectoryPath = Environment.CurrentDirectory +"\\log";
private readonly string logFile;
private Logger()
{
this.logFile = this,.logDirectoryPath+"\\"+logFileNmae+".txt";
}
private static readonly object O = new object();
public static Logger GetInstace()
{
lock(O)
{
return instance??(instance = new Logger());
}
}
private void ReadyToLog()
{
//文件的创建及验证功能。
}
private static object infoO = new object();
public void Info()
{
try
{
lock(infoO){ ReadyToLog();}
}
catch(Exceeption ex)
{
}
try
{
lock(infoO)
{
using(StreamWriter sw = File.AppendText(this.logFile))
{
sw.WriteLine(" sdfasdf ");
}
}
}
catch(exception ex)
{
}
}
}
public void TestMethod2()
{
Lgger log = Logger.GetInstance();
for(int i = 0; i<20;i++)
{
Thread t = new Thread(Work);
t.Name = "t"+i;
t.Start(t.Name);
}
}
private void Work(object o)
{
string name = o.ToString();
int i=0;
while(i<1000)
{
Logger log = Logger.GetInstance();
Try{log.Info(name+" : 第"+i+"次获取实例并记录日志。")}
catch(exception ex){}
i++;
}
}
public static void WriteLogToFileSystem(string className, object message, EventLogEntryType type)
{
var content = GetEventString(message); //无法确保对象引用message不被修改,因此此语据不能异步处理
var dir = new DirectoryInfo(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Log", DateTime.Now.ToString("yyyy_MM_dd")));
var file = new FileInfo(Path.Combine(dir.FullName, className + "_" + type.ToString() + ".txt"));
var sp = new string('-', 20);
var msg = string.Format("{0} {1} {0}\r\n\r\n{2}\r\n\r\n", sp, DateTime.Now.ToString("HH:mm:ss.fff"), content);
ThreadPool.QueueUserWorkItem(h =>
{
lock (WriteLogFlag)
{
CreateDir(dir);
using (var fw = file.Open(FileMode.Append, FileAccess.Write))
using (var sw = new StreamWriter(fw))
{
sw.Write(msg);
sw.Close();
}
}
});
}
你可以用你的测试程序跑一下,看看有没有类似的异常现象。如果有就贴出测试程序来。private static object WriteLogFlag = new object();
public static void WriteLogToFileSystem(string className, object message, EventLogEntryType type)
{
var content = GetEventString(message); //无法确保对象引用message不被修改,因此此语据不能异步处理
ThreadPool.QueueUserWorkItem(h =>
{
var dir = new DirectoryInfo(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Log", DateTime.Now.ToString("yyyy_MM_dd")));
var file = new FileInfo(Path.Combine(dir.FullName, className + "_" + type.ToString() + ".txt"));
var sp = new string('-', 20);
var msg = string.Format("{0} {1} {0}\r\n\r\n{2}\r\n\r\n", sp, DateTime.Now.ToString("HH:mm:ss.fff"), content);
lock (WriteLogFlag)
{
CreateDir(dir);
using (var fw = file.Open(FileMode.Append, FileAccess.Write))
using (var sw = new StreamWriter(fw))
{
sw.Write(msg);
sw.Close();
}
}
});
}
private static string GetEventString(object message)
{
string msg;
if (message is Exception || message is string)
msg = message.ToString();
else
{
try
{
msg = JToken.FromObject(message).ToString();
}
catch
{
msg = message.ToString();
}
}
return msg;
}
lock(infoO)
{
try
{
ReadyToLog();
File.AppendText(this.logFile, " sdfasdf ")
}
catch(Exceeption ex)
{
// write error message to windows event log
}
}
换掉这堆代码试试
try
{
lock(infoO){ ReadyToLog();}
}
catch(Exceeption ex)
{
}
try
{
lock(infoO)
{
using(StreamWriter sw = File.AppendText(this.logFile))
{
sw.WriteLine(" sdfasdf ");
}
}
}
catch(exception ex)
{
}