2014-12-22 4 views
3

ClickOnce가 배포 한 WinForms 앱이 있습니다. 사용자는 앱의 여러 인스턴스를 시작할 수 있습니다. 각 인스턴스는 별도의 로그 파일에 기록해야합니다. 런타임시 현재 인스턴스의 로그 파일을 검색 할 수 있어야합니다. 따라서 충돌 보고서 등을 보낼 때 사용할 수 있습니다.NLog를 여러 앱 인스턴스와 함께 사용

이제 여러 인스턴스 요구 사항을 해결할 수 없습니다. (실제로 필요한 것은 탭이있는 UI이지만 기존 앱의 큰 난제 중 하나입니다. 지금은 구현할 수 없습니다.)

일반적으로 로깅은 작동하지만 별도의 앱 인스턴스가 동일한 파일을 덮어 씁니다. .

나는 로그 파일 이름에 타임 스탬프를 추가하려고 노력하지만, 작동하지 않았다 :

<target name="logfile" xsi:type="File" 
       fileName="${specialfolder:folder=ApplicationData}/MyCompany/CRM/crm_${longdate}.log" 
       deleteOldFileOnStartup ="true" 
       layout="${longdate} ${message} ${exception:format=tostring}"/> 

은이 모든 수 있습니까?

답변

2

응용 프로그램의 컨텍스트 내에서 해당 인스턴스에 대해 유효한 (의미있는) 이름을 알 수 있습니까? 응용 프로그램의 이름을 나타내는 명령 줄 매개 변수로 여러 인스턴스를 시작할 수 있습니까? 응용 프로그램의 유용한 이름을 "알 수"있는 경우 GlobalDiagnosticsContext에 이름을 저장하고 GlobalDiagnosticsContext LayoutRenderer를 사용하여 파일 이름을 작성할 수 있습니다. 이 같은 GDC를 설정합니다, 응용 프로그램 시작 논리에서

<target name="logfile" xsi:type="File" 
      fileName="${specialfolder:folder=ApplicationData}/MyCompany/CRM/crm_${gdc:item=application}.log" 
      deleteOldFileOnStartup ="true" 
      layout="${longdate} ${message} ${exception:format=tostring}"/> 

:

그래서, 구성은 다음과 같이 표시 될 수 있습니다

GlobalDiagnosticsContext.set("application", GetApplicationNameFromCommandLineArgs()); 

자체 로그에 기록됩니다 각 응용 프로그램 파일로, 명령 행 매개 변수에 따라 이름이 지정됩니다.

행운을 빈다.

+0

음 ... 재미 있습니다. 사용자가 동일한 바로 가기를 사용하여 인스턴스를 열기 때문에 명령 줄 매개 변수로이 작업을 볼 수 없습니다. 그러나 각 인스턴스에 고유 한 이름 (예 : 시작 시간 포함)을 생성 한 다음 GlobalDiagnosticsContext를 통해이를 사용할 수 있습니까? – EagleBeak

+0

예. 독특한 것이있는 한. 심지어 guid를 사용하여 로그 파일의 이름을 지정할 수도 있습니다 (즉, GUID를 만들어 GDC에 넣으십시오). 이 방법으로 로그 파일의 이름을 지정하는 유일한 문제는 파일을 이름으로 구별하기 어렵다는 것입니다. 실제로 A.log, B.log, C.log 등과 같은 로그 파일을 얻을 수 있습니다. 그러나 응용 프로그램이 더 자세한 식별 정보를 제공 할 수없는 경우에는 그 제한 사항으로 살아야합니다. – wageoghe

+0

좋습니다. 멋지 네요. 시작 시간은 차별화 요소로 충분해야합니다. 나는 오늘이나 내일 후에 이것을 시험해 볼 시간을 찾고 그 답을 받아 들일 수 있기를 바랍니다. – EagleBeak

관련 문제