2014-11-26 2 views
0

사용자가 파일을받은 응용 프로그램 (DOC, PDF)이 Command Line인데,이 파일은 동일한 컴퓨터에 있으며 내 응용 프로그램은이 파일을 특정 폴더에 복사합니다. 0을 반환하면이 연산이 전달되고 그렇지 않으면 1이 반환됩니다. 이 명령 줄 exe file은 여러 번 동시성을 열 수 있으며 문제가 없습니다. 이제 응용 프로그램 폴더에 찾을 Log을 추가하고이 Log은 각 파일 이름을 쓰고 작업이 성공 또는 실패했는지 기록합니다. 이제는 여러 개의 열린 프로세스가있는 상황에서 어떻게 처리해야하는지, 그리고 어떻게하면 2/이 내 로그에 동시에 쓰려고하는지 상황을 피할 수 있습니다. 을 동시에 사용하고 있는데 은 lock을 사용할 수 있습니까?다른 EXE 파일에서 동시에 쓸 수있는 로그를 내 응용 프로그램에 추가하십시오.

+2

log4net을 살펴보십시오. 휠이 이미 생성 된 경우 휠을 다시 생성하지 마십시오. –

답변

1

로그 파일을 만들지 마십시오. ETW를 사용하고 windows 메커니즘에 로그온하십시오. 이벤트 로그가 새로운 것이 아니며 (오랜 시간 동안 존재합니다) ETW는 이제 nuget 패키지를 통해 완벽하게 지원됩니다.

ETW도 커널 기반입니다.

+0

이것은 .net 4에 대한 지원이기도합니다. –

+0

아니요,하지만.NET 4는 현재 버전이 아니며 프레임 워크의 오래된 버전에서 작동하는 태그가 필요하지 않습니다. – TomTom

2

당신은 Mutex.TryOpenExisting("MyMutex", resultMutex)을 사용할 수 뮤텍스가 지정됩니다 보장하기 위해 파일을

// 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); 

로그에 대한 액세스를 제어하기 위해 명명 된 시스템 뮤텍스를 만들 수 있으며이 존재하는 경우, 대기 로그 및 그것을

resultMutex.WaitOne(); 
    Log("success"); 
    resultMutex.ReleaseMutex(); 
을 해제 할 수 있습니다

MSDN에서 더 많은 정보보기 : http://msdn.microsoft.com/en-us/library/System.Threading.Mutex(v=vs.110).aspx

+0

이 기술을 사용하려면 "MyMutex"이외의 이름을 사용하십시오. 실제로 다른 이름으로는 사용되지 않는 이름을 생각해 내십시오. MyApplicationName.LogFileMutex.Number와 같은 것입니다. 그래서 앱이 "Foo"라고 불리면 "Foo.LogFileMutex.8793504"와 같은 것을 가질 것입니다. 그렇게하면 시스템 오브젝트 이름을 다른 것과 충돌시키지 않을 것입니다. –

0

로그의 청결을 신경 쓰지 않는다면 로그 파일을 열 수 있습니다 WS 여러 프로세스에 쓸 수 있습니다 :

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

즉 :

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); 
} 

의 단점은 두 프로세스가 파일에 작성하는 경우 동시에 다음과 같이 표시됩니다 엉망를 얻을 수 있습니다 것입니다 프로세스가 서로 경쟁하고 결국 로그 엔트리가 혼합됩니다. 동일한 로그 파일에 너무 많은 프로세스를 작성하지 않고 각 프로세스가 드물게 작성하는 경우 이와 같은 충돌이 거의 발생하지 않아야합니다.

주위에는 여러 가지 방법이 있습니다. 하나는 각 프로세스에서 읽기 전용 모드로 파일을 열고 파일을 사용할 수있을 때까지 다른 프로세스를 기다리는 것입니다. 가장 중요한 방법은 성공할 때까지 try-catchFile.AppendAllText()입니다. this one과 같은 질문에 다른 옵션이 나와 있습니다.

다른 대안은 로그를 여러 파일 또는 파일이 아닌 다른 파일에 쓰는 것입니다. DB에.

+0

그러나 한 응용 프로그램이 현재 다른 응용 프로그램이 쓰는 동안 쓰기를 시도하면 예외가 발생합니다. 두 응용 프로그램 모두 쓰기 위해 파일을 열어 둘 수 있지만 둘 다 같은 순간에 * 쓰려고하면 그 중 하나가 예외를 throw합니다. –

0

가장 깨끗한 SOA 기반 접근 방식 중 하나는 프로세스 (또는 프로세스)가 로그 정보를 호출 할 별도의 로깅 서비스를 사용하는 것입니다. Log4Net은 클라이언트와 서버가 각각 메시지를 게시하고 사용하는 메커니즘을 제공합니다. 자세한 내용은 https://log4netremotelogging.codeplex.com/을보십시오.

관련 문제