【发布时间】:2010-07-13 05:15:15
【问题描述】:
我正在尝试找出登录我正在使用的异步 IO Web 服务器的最佳策略。我认为最简单的方法是创建一个单例类,让 Filestreams 为相应的日志文件保持打开状态,这样我就可以执行以下操作:
Util.Logger.GetInstance().LogAccess(str);
或者类似的东西。
我的班级是这样的:
public sealed class Logger {
private static StreamWriter sw;
private static readonly Logger instance = new Logger();
private Logger() {
sw = new StreamWriter(logfile);
}
public static Logger GetInstance() {
return instance;
}
public void LogAccess(string str) {
sw.WriteLine(str);
}
}
这一切都只是在我的脑海中,我正在寻找有关如何使其变得更好并确保我做得正确的建议。最重要的是我需要它是线程安全的,显然它不在当前状态。不确定最好的方法。
【问题讨论】:
-
您使用的是 .NET 4 吗?新的异步库可以帮助您。 (我也将借此机会指出这在 F# 中将如何优雅地完成,并请假!)
-
使用 Singleton 与仅使用静态方法相比有何价值?
-
我喜欢你想自己尝试的事实。构建日志并不难,但创建一种处理线程的好方法是一项挑战。建议的框架都可以,但是自己创建它会给你一个很好的机会来学习和使用线程安全。如果您希望多个应用程序(或在 ASP.NET 应用程序池/服务器中)写入同一个文件,这确实具有挑战性,因为在这种情况下,仅线程安全是不够的。
-
我个人喜欢有一个日志类的实例,无论是单例的、静态的,还是不是,因为我可以在每个实例级别自定义日志记录的行为。我可以为我的应用程序的一部分提供一个实例,为我的应用程序的另一部分提供一个不同的实例,以便我可以分别自定义两者的日志记录行为。
标签: c# logging singleton thread-safety