Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 正在将日志写入“日志”;“编辑锁定”;文件,该文件引发异常。如何解决这个问题?_C#_Logging - Fatal编程技术网

C# 正在将日志写入“日志”;“编辑锁定”;文件,该文件引发异常。如何解决这个问题?

C# 正在将日志写入“日志”;“编辑锁定”;文件,该文件引发异常。如何解决这个问题?,c#,logging,C#,Logging,我运行了多线程操作,每个操作都会在日志文件中添加一些信息。问题是,有时日志文件被锁定进行编辑,同时被其他线程访问,这会引发异常。如何确保日志正确写入 下面是片段 try { File.AppendAllText(fileName, appendString); } catch (System.Exception ) { } 现在,我只是忽略了例外情况。这会导致一些日志未被写入。您是否尝试过创建一个仅用于更新日志的线程,然后让其他线程添加到日志更新程序线程将处理的线程安全队列中

我运行了多线程操作,每个操作都会在日志文件中添加一些信息。问题是,有时日志文件被锁定进行编辑,同时被其他线程访问,这会引发异常。如何确保日志正确写入

下面是片段

 try
 {
  File.AppendAllText(fileName, appendString);
 }
 catch (System.Exception )
 {
 }

现在,我只是忽略了例外情况。这会导致一些日志未被写入。

您是否尝试过创建一个仅用于更新日志的线程,然后让其他线程添加到日志更新程序线程将处理的线程安全队列中


这似乎比从所有其他线程写入文件更好。

您需要同步日志写入。

发生的情况是两个线程同时附加到日志文件

请尝试以下操作:

class Program
{
    public static readonly object LogWriteLock = new object();

    // The rest of your Program class.
}
然后,在写入日志时:

lock (Program.LogWriteLock)
{
    File.AppendAllText(fileName, appendString);
}
它的作用如下。创建一个对象(
Program.LogWriteLock
),用于“同步”日志操作。然后,当一个线程写入日志文件时,下一个线程只需等待第一个线程完成,然后再写入

您甚至可以将其包装到一个漂亮的小助手类中,您可以得到如下结果:

public static class LogHelper
{
    private static readonly object _syncRoot = new object();

    public static void AppendToLog(string appendString)
    {
        lock (_syncRoot)
        {
            File.AppendAllText("log.txt", appendString);
        }
    }
}

用您的实际日志文件位置替换
“log.txt”

使用file.AppendAllText()是一种非常昂贵的日志记录方式。查看log4net,了解一种改进了很多的日志记录方法。当然,锁是没有问题的。你可以考虑像NLog这样的免费日志框架。在这一点上,与日志记录相关的挑战已经得到了很好的理解,使用现有的日志记录框架将为您省去重新发现和实施解决方案的麻烦。事实上,在令人沮丧地无法解决此问题之后,我确实查找了日志库。尝试了log4net,但未成功。显然,log4net最后一次更新是在2006年,它不支持VisualStudio2010。另外,编辑配置非常混乱和乏味。在log4net上浪费了几个小时,最后没有成功。切换到nlog并在几分钟内将其启动并运行。nlog的问题是它不支持wpf元素(richtextbox支持仅适用于windows窗体)。现在正在尝试使用内存目标写入richtextbox。哇!谢谢我想知道为什么谷歌没有引导我找到这种解决方案。我要试试。事实上,我确实想到了。问题是,我不太熟悉多线程,我不知道从哪里开始。我甚至不知道要搜索的关键字。