并File.AppendAllText
管理来自多个作家的冲突?
我注意到MSDN文档并没有提供任何一种位置,所以我决定我会反映代码,看看它的作用.以下是从以下方法调用的方法File.AppendAllText
:
private static void InternalAppendAllText(string path, string contents, Encoding encoding)
{
using (StreamWriter streamWriter = new StreamWriter(path, true, encoding))
{
streamWriter.Write(contents);
}
}
Run Code Online (Sandbox Code Playgroud)
而你可以看到它只是利用了一个StreamWriter
.所以,如果我们深入研究它,特别是它使用的构造函数,我们发现它最终会调用这个构造函数:
internal StreamWriter(string path, bool append, Encoding encoding, int bufferSize, bool checkHost) : base(null)
{
if (path == null)
{
throw new ArgumentNullException("path");
}
if (encoding == null)
{
throw new ArgumentNullException("encoding");
}
if (path.Length == 0)
{
throw new ArgumentException(Environment.GetResourceString("Argument_EmptyPath"));
}
if (bufferSize <= 0) …
Run Code Online (Sandbox Code Playgroud) 我需要登录到一个文件,因为客户没有我可以使用log4net登录的控制台.现在我读到FileAppender不是线程安全的.无论如何有一种方法来记录一个应用程序中的文件,该应用程序退出不同的线程或什么是常见的替代方案?
TickZoom是一款性能非常高的应用程序,它使用自己的并行化库和多个操作系统线程来平滑地利用多核计算机.
该应用程序遇到瓶颈,用户需要从单独的O/S线程向LogAppender写入信息.
FileAppender使用MinimalLock功能,以便每个线程可以锁定并写入该文件,然后释放它以供下一个要写入的线程使用.
如果MinimalLock被禁用,log4net将报告有关已被另一个进程(线程)锁定的文件的错误.
log4net执行此操作的更好方法是使用单个线程来处理写入FileAppender,而任何其他线程只是将其消息添加到队列中.
这样,可以禁用MinimalLock以大大提高日志记录的性能.
此外,该应用程序执行大量CPU密集型工作,因此它还可以提高性能,使用单独的线程写入文件,以便CPU永远不会等待I/O完成.
所以问题是,log4net是否已经提供此功能?如果是这样,你如何启用线程写入文件?是否还有另一个更高级的追加者?
如果没有,那么由于log4net已经包含在平台中,因此可以在TickZoom代码中为此目的实现单独的线程和队列.
真诚的,韦恩
编辑:
谢谢,似乎答案指向开发我们自己的解决方案,可能是某种方式的log4net的扩展.他们清楚地表明log4net不会做这类事情.
此外,我们刚刚意识到我们可能"滥用"日志系统,该系统主要用于通知重要事件或调试信息的人类可读消息.软件输出的这一特定部分仅用于验证系统准确性的自动化工具.
当然,我们也以"正常"方式使用log4net进行调试,警告等.
但这些更像是"事务日志",而不是调试或用户通知日志.更具体地说,这些日志不必直接是人类可读的.如果需要,某种"查看器"可以以ASCII格式显示内容.
因此我们计划将这些事务类型的日志写入高速二进制存储.
谢谢,以下两个答案似乎都非常适合开发我们自己的解决方案.
请注意,我在SO上看到了这些问题(讨论了log4net的线程安全性),我怀疑他们回答了我的问题,但我还是会问:
最近我写了一个用于日志记录的WCF服务.这个想法非常类似于Clog(或者在Calcium下寻找Clog).基本上,我已经实现了一个用于Silverlight客户端(Silverlight类库)的日志API.日志记录API或多或少是我们在应用程序中的其他地方使用的Common.Logging for .NET API的克隆.API的实现将所有日志记录消息转发到WCF日志记录服务,该服务本身是根据Common.Logging实现的.
在看Clog的时候,我在Log4NetStrategy
课堂上发现了以下代码让我觉得有些奇怪:
/// <summary>
/// All Write log calls are done asynchronously because the DanielVaughan.Logging.Log
/// uses the AppPool to dispatch calls to this method. Therefore we need to ensure
/// that the call to Log is threadsafe. That is, if an appender such as FileAppender is used,
/// then we need to ensure it is called from no more than one thread at a …
Run Code Online (Sandbox Code Playgroud)