将日志添加到我的应用程序,可以同时从不同的EXE文件写入

时间:2014-11-26 14:06:04

标签: c# .net multithreading

我有Command Line应用程序从用户(DOC,PDF)接收文件,此文件位于同一台机器上,我的应用程序将此文件复制到特定文件夹并返回0此操作已通过,否则为1。 此命令行exe file可以打开多次并发,并且没有问题。 现在我想在我的应用程序中添加一个Log,它将位于应用程序文件夹中,此Log将写入每个文件名,如果操作通过或失败。 现在我想知道如何实现这一点,以防我有几个开放进程以及如何避免2 exe files尝试同时写入我的日志的情况。 虽然我在同一时间使用了多个lock,但在这种情况下可以使用exe files吗?

4 个答案:

答案 0 :(得分:2)

您可以创建命名系统互斥锁来控制对日志文件的访问

// Set this variable to false if you do not want to request  
// initial ownership of the named mutex. 
bool requestInitialOwnership = true;
bool mutexWasCreated;

// Request initial ownership of the named mutex by passing 
// true for the first parameter. Only one system object named  
// "MyMutex" can exist; the local Mutex object represents 
// this system object. If "MyMutex" is created by this call,
// then mutexWasCreated contains true; otherwise, it contains 
// false.
Mutex m = new Mutex(requestInitialOwnership, "MyMutex", out mutexWasCreated);

要确保有命名的互斥锁,您可以使用Mutex.TryOpenExisting("MyMutex", resultMutex),如果它存在,您可以等待,记录并释放它

    resultMutex.WaitOne();
    Log("success");
    resultMutex.ReleaseMutex();

MSDN中提供了更多信息:http://msdn.microsoft.com/en-us/library/System.Threading.Mutex(v=vs.110).aspx

答案 1 :(得分:1)

不要制作日志文件。使用ETW并登录到Windows机制。它不像事件日志是新的(它存在很长时间),现在通过nuget包完全支持ETW。

ETW也是基于内核的。

答案 2 :(得分:0)

如果您不太关心日志的清洁程度,可以通过允许多个进程写入日志文件的方式打开日志文件:

private static Stream CreateFile(string path, bool checkHost)
{
    var mode = FileMode.Append;
    return new FileStream(path, mode, FileAccess.Write, FileShare.ReadWrite, 4096, FileOptions.SequentialScan, Path.GetFileName(path), false, false, checkHost);
}

缺点是,如果两个进程同时写入文件,那么你将得到一个看起来像这样的混乱:

2014-11-26 11:32:93 Suc2014-11-26 11:32:93 Failed: file "Some.doc" seeded: file "Other.doc"

即。这些进程相互竞争,最终会出现混合的日志条目。如果您没有太多进程写入同一个日志文件,并且每个进程不经常写入,那么您应该很少发生这样的冲突。

有几种方法可以解决它。一种是在每个进程中以只读模式打开文件,并等待其他进程直到文件可用;最简单的方法是在成功循环中try-catch File.AppendAllText(),直到你成功为止。 this one等问题中列出了其他选项。

另一种方法是将日志写入多个文件,或者写入文件以外的文件,例如到DB。

答案 3 :(得分:0)

最干净且基于SOA的方法之一是使用单独的日志记录服务,您的进程(或进程)将调用这些服务来记录日志信息。 Log4Net为客户端和服务器提供了分别发布和使用消息的机制。请查看https://log4netremotelogging.codeplex.com/了解更多详情。