[英]C# correct implementation of a StreamWriter for a logger class
我的项目遇到了一个奇怪的问题。
这是我的记录器 class:
using System.Diagnostics;
using System.IO;
namespace someSpace
{
public enum LogTarget
{
File, Database, EventLog
}
public static class LogHelper
{
private static LogBase logger = null;
public static void Log(LogTarget target, string path, string message)
{
switch (target)
{
case LogTarget.File:
logger = new FileLogger();
logger.Log(path, message);
break;
case LogTarget.EventLog:
logger = new EventLogger();
logger.Log("", message);
break;
default:
return;
}
}
}
public abstract class LogBase
{
protected readonly object lockObj = new object();
public abstract void Log(string path, string message);
}
public class FileLogger : LogBase
{
public override void Log(string path, string message)
{
lock (lockObj)
{
File.Open(path, FileMode.Open).Close();
using (StreamWriter streamWriter = new StreamWriter(path))
{
streamWriter.WriteLine(message);
streamWriter.Close();
}
}
}
}
public class EventLogger : LogBase
{
public override void Log(string path, string message)
{
lock (lockObj)
{
EventLog m_EventLog = new EventLog("");
m_EventLog.Source = "IDGEventLog";
m_EventLog.WriteEntry(message);
}
}
}
}
我像这样调用 function 日志...
LogHelper.Log(LogTarget.File, LOG_FILE_PATH, e.ToString());
我假设通过在我的 class 中使用“使用”结构,stream 将自动关闭,随后文件将被关闭并释放。
这不会发生; 程序的后续运行一直说该文件仍在被某个进程使用。 我不知道如何诊断问题。
lock (lockObj)
{
var file = File.Open(path, FileMode.Open);
using (StreamWriter streamWriter = new StreamWriter(file))
{
streamWriter.WriteLine(message);
streamWriter.Close();
}
file.Close();
}
也以这种方式修改为提示评论但问题仍然存在......
每次调用 Log 都会创建一个带有自己 lockObj 的新记录器,其他记录器不会被锁定。 使 lockObj 成为 static 成员。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.