2011-12-01 4 views
0

나는 multi-process safe가 아니라 log4net의 문제를 해결하려고 노력 중이다. 때로는 로그 파일이 잠기고 동일한 응용 프로그램의 다른 스레드가 해당 파일에 쓸 수 없기 때문입니다. 내가 뭘 하려는지 그것의 스레드에 고유 한 ID로 로그 파일을 만드는 것입니다. 현재 Thread.CurrentThread.GetHashCode(), Process.GetCurrentProcess() 및 System.Environment.MachineName을 파일 이름의 일부로 사용하고 있습니다. 이 정도면 충분하지 않습니까? 아니면 다중 스레드/프로세스/웹 팜/웹 가든 로그 파일 이름으로 안전한 고유 ID를 얻는 더 좋은 방법이 있습니까? 또는 로그 파일을 작성하는 더 좋은 방법이 있습니까? 미리 감사드립니다.다중 스레드, 다중 프로세스, 웹 가든 및 웹 팜 상황에서 고유 한 ID를 얻는 방법은 무엇입니까?

답변

1

제대로 이해하면 컴퓨터 당 프로세스 당 스레드 당 하나의 로그 파일을 만들고 싶습니다.

machine1_processid1_thread1.log 
machine1_processid1_thread2.log 
machine1_processid2_thread1.log 
machine2_processid1_thread1.log 
etc... 

당신이 실제 값은 로그 파일 이름의 구성 요소에 대해 무슨 상관 이죠 : 그래서, 당신이 무엇을하고 있는지에 대한 설명 제공, 로그 파일 이름은 다음과 같이 보일 수 있는가? 즉, 로그 파일 이름을 식별 가능한 구성 요소 (시스템 이름, 스레드 ID, 프로세스 ID 등)로 구성하는 것이 중요한가? 또는 로그 파일 이름이 단순히 고유 한 것으로 충분합니까?

한 가지 방법은 단순히 Guid를 사용하는 것입니다.

string logFileName = Guid.NewGuid().ToString() + ".log" 

아마 고유 한 이름의 로그 파일을 가진 당신의 목표를 달성하는 것입니다 : 당신이 당신의 로그 파일 이름을 생성하는 경우 그래서, 당신이 뭔가를 할 수 있습니다. 나는 결국 Guides의 충돌이 될 수 있다고 생각하지만 확실히 말할 충분한 것을 알지 못합니다. 그러나이 방법은 사용자에게 친숙하지 않습니다. guid 기반 파일 이름으로 가득 찬 폴더를 실제로보고 싶은 사람과 실제로보고 싶은 파일을 결정하려고 시도한 사람은 누구입니까?

아마도 로그를 생성하는 시스템과 프로세스를 아는 것이 유용할까요? 그렇게하면 특정 시스템 또는 특정 프로세스에서 문제가 발생한다는 것을 알고 있거나 의심되는 경우 해당 시스템/프로세스에서 생성 된 파일 만 찾을 수 있습니다. 이 경우, 당신은 여전히 ​​파일의 이름을 GUID를 사용할 수 있지만 컴퓨터 이름 및/또는 프로세스를 증대 ​​할 수 :

string logFileName = string.Format("{0}_{1}_{2}.log", 
            Environment.MachineName, 
            Process.GetCurrentProcess().ProcessName, 
            Guid.NewGuid()); 

이 좀 더 사용자 친화적 인 로그 파일 이름을 지정해야하고, 모든 기준에서 여전히 고유합니다.

요약하면 자신의 알고리즘을 제시하지 않고 Globally Unique Identifier를 제공하는 것이 명시된 목적이므로 Guid를 사용하는 것이 좋습니다. 위에서 언급 한 주요 단점은 guid 기반 로그 파일로 가득 찬 폴더를 파헤쳐 "옳은"것을 찾으려고하는 것이 성가시다는 것입니다. 컴퓨터 이름, 프로세스 이름 등과 같은 사용자 친화적 인 데이터로 파일 이름을 늘리면 도움이 될 수 있습니다.

마지막으로, Guid를 사용하는 경우 guid를 포맷 할 때 사용할 수있는 옵션이 몇 가지 있습니다.

http://msdn.microsoft.com/en-us/library/97af8hh4.aspx

+0

감사 wageoghe. 이러한 로그 파일을 일반 로그 파일에 자동으로 추가하는 로그 정리 기능이 있으므로 로그의 이름은 신경 쓰지 않습니다. 문제는이 GUID를 어디서 얻을 수 있는가하는 것입니다. 웹 사이트에 대한 나의 이해 (내가 틀릴 수도 있습니다.)는 때로는 같지만 여전히 똑같은 것 같습니다. 백엔드가 이미 다른 것으로 변경되었을 수 있습니다. 이전 잠금이 아직 잠금을 유지하고 있으면 새 잠금이 로그를 쓸 수 없습니다. – biajee

+0

솔직히, 나는 주로 데스크탑 개발을하기 때문에 웹 개발의 복잡함에 정통하지 않습니다. 이미 설명 된대로 파일 이름을 생성했다면 Guid.NewGuid를 사용하여 이름을 생성하는 방법을 변경할 수 있습니다. Log4net 구성을 사용하여 코드를 통해 log4net을 구성하는 경우 log4net 구성을 사용하여 설명하는 것처럼 파일 이름을 만들 수 없다고 생각할 수 있습니다 (예 : 스레드의 해시 코드 사용). 그러면 추측 할 수 있습니다. 당신은 단지 당신이 로그 파일 이름 (그리고 guid)을 만들 수 ... – wageoghe

+0

... 구성 log4net. 나는 웹 개발에 익숙하지 않아서 여러 프로세스/스레드가 재생되는시기와 그 환경에서 log4net을 가장 효과적으로 사용하는 방법에 대한 정보를 훨씬 많이 제공합니다. 나는 당신이 여기 주위에 파고 들어 당신이 도움이 될 asp.net와 log4net을 사용하는 방법에 대한 좋은 정보를 찾을 것입니다 용의자. – wageoghe

1

일반 이론 : 프로세스 ID/스레드 ID를 더한 시스템 ID (호스트 이름, 또는 더 나은 것은 첫 번째 네트워크 인터페이스의 MAC 주소)는 보편적으로 고유해야합니다. 그렇습니다. 유효한 해결책이 있다고 생각합니다. .

MAC 주소는 얻을 수 있으면 좋지만, 보편적으로 고유 한 "보장"되어 있기 때문에 MAC 주소는 훌륭합니다 (가상화로 인해 문제가 발생할 수 있음). 호스트 이름은 "고유해야하지만 그보다는 약간의 보증이 있습니다 (예 : 누군가 복제 된 일련의 기계를 들고 실수로 호스트 이름을 모두 일치하도록 설정합니다). 나는 (당신이 asp.net이라는 태그가 붙어 있기 때문에) 당신이 독특한 호스트 이름을 보장하는 어떤 종류의 Windows 도메인에서 돌아가고 있다고 가정 할 것이다.

+0

그래, Windows 도메인입니다. – biajee

관련 문제