我目前正在质疑一段代码,关于它的有效性和资源消耗。以下是将编译为DLL的全局日志记录实用程序方法。该方法可以同时访问。
private static void Log(string logType,
string severity,
object sender,
string format,
params object[] args)
{
if (Logger._logLock.WaitOne(250))
{
try
{
using (StreamWriter sw = new StreamWriter(Logger._activityLogPath, true))
{
if (logType != "RAW")
{
sw.Write("{0} {1} {2} ",
DateTime.Now,
logType,
severity);
}
sw.WriteLine(format, args);
}
}
finally
{
Logger._logLock.ReleaseMutex();
}
}
}
困扰我的是“使用”块,它将从同一个文件创建一个流,每次记录某些内容(每秒多次调用)。我知道文件缓存所以我不完全确定重新安装流是一个太大的问题(不必要的流缓冲初始化?)。我正在考虑将StreamWriter作为变量添加到Logger类中,但我还想确保在单元不正确地关闭时正确关闭或刷新写入器。众所周知,最终用户只关闭了设备。我正试图找到安全和速度之间的平衡,并且只是希望获得一些洞察力。感谢。
答案 0 :(得分:1)
a)是的,每次创建一个流都不是很有效。例如,您可能会考虑在某种集合中收集消息,并在固定的时间间隔内写入/附加此集合,可能是从另一个线程到文件......这样您就不需要等待250ms了可以附加到集合,线程将使用集合的内容。您还应该保持流打开 - 如果其他应用程序锁定文件,您执行此操作的方式可能会失败...如果在写入硬件关闭后刷新,则不应影响日志文件的内容。
b)有许多测试框架经过良好测试,灵活且具有出色的性能......为什么要重新发明轮子?答案 1 :(得分:0)
如果设备硬件关闭不正确,我还要确保编写器正确关闭或刷新。
如果用户在未刷新流的情况下关闭设备,则无法正常关闭,无论您是否使用using
(using
的关键时间跨度可能会缩短并且无需手动冲洗。)
不是每次都创建一个新的StreamWriter
,而是创建一次并在写完后刷新它。但请注意,如果您想100%确定,则需要某种硬件(读取:缓冲电池,UPS)。