2012-09-18 7 views
3

나는 사소한 것을 놓친 경우에 nlog를 처음 접하며 용서할 수 없습니다.여러 버전의 nlog 사용

IIS7을 사용하는 여러 응용 프로그램을 호스팅하고 있으며, 일부는 nlog 1.0.0.505를 사용하고 일부는 NLog 2.0을 사용합니다. 두 버전을 모두 수용 할 web.config를 만드는 방법을 모르겠습니다.

nlog.dll의 여러 버전을 GAC에 넣을 수 있도록하여 각 응용 프로그램에 선택할 버전 목록이 있습니까?

GAC에서 nlog를 제거하고 응용 프로그램에 배포 된 nlog를 사용하게하는 것이 더 좋은 방법일까요? 이 경우, web.config에서 nlog를 어떻게 참조 할 것인가? (목표 설정 등)

내가 더 많이 읽을 수있는 곳으로의 도움이나 조언을 부탁드립니다.

미리 감사드립니다.

답변

3

각 응용 프로그램마다 또는 적어도 종속 버전의 다른 버전을 사용하는 각 응용 프로그램마다 별도의 응용 프로그램 도메인을 만들고 싶을 것입니다. 단일 앱 도메인은 동일한 dll의 여러 버전을로드 할 수 없습니다.

1

응용 프로그램이 nlog.dll 파일을 제공하도록 허용하고 글로벌 web.config에서 버전 번호를 지정하지 않았습니다.

0

어떤 싸움 후 ...를 GAC (글로벌 Assymbly 캐시)가 발명 된 이유의 하나가 복수를 사용하는 것을 말하며

시작할 수 있습니다 (u는 이야기를 싶지 않는 경우 바로 아래의 코드를 복사) 같은 장소에있는 dll 버전.

so..i NLog2.0에 의존하는 dll로 두 번째 솔루션을 추가해야하는 NLog 2.0과 Sharepoint 프로젝트가 있습니다. 문제는 GAC로 모두 푸시 한 후입니다 (SafeControls에 대한 것입니다 - sp dev에 해당). 로거가 새로운 솔루션에 로그인 한 적이 없다는 것입니다.

난 내 Web.config를 다시 보았을 때 고리 종

<section name="nlog" type="NLog.Config.ConfigSectionHandler, NLog, Version=2.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c" /> 

을 주목 버전 = 내가 NLog 그냥 이전에 대한 구성을로드하도록 얻었다 2.0.0.0

그럼 proj 그리고 어떻게 든 3.2 dll을 사용하기 시작하면 그것을 지나치지 않습니다.

또한 DeepCopy를 사용하여 구성을 다시로드하려고 시도했지만 그 이유는 알지 못합니다.

그런 다음 코드에서 LoggingConfiguration을 다시 정의하여 이전 구성을 저장하고 해당 클래스에 로그인 한 다음 소멸자에서 다시 반복하여 이전 구성으로 다시 초기화하는 동안 로거를 다시 초기화합니다.

로거가 2.0 환경 설정에서 모든 곳에서 3.2를 사용하고있는 것으로 추측됩니다.

그런데 나는 2 가지를 싫어했다 : 1 - 소멸자가있다, 2 - 웹에서 설정을 가지지 않았다.구성, 그리고 모든 그 해협 didnt 작업을 할려고 노력하고 로그와 함께 가끔은 약간의 지연이 있다는 것을 관찰했다 아마도 내가 아마 일부 큐 또는 뭔가 내가 finnaly 올바른 방법을 알게 될 것이다 CTOR을 다시 시작해야 알았어 적절하게 NLog :

public EncryptEventReceiver() 
    { 
     oldConfig = LogManager.Configuration; 

     Task t = new Task(() => 
     { 
      FileTarget target = new FileTarget(); 
      target.FileName = "c:\\Data\\Logs\\MyProj\\EncryptEventReceiver.txt"; 
      target.Layout = "${message}"; 
      target.Encoding = Encoding.UTF8; 

      LoggingRule rule = new LoggingRule("*", LogLevel.Trace, target); 

      LoggingConfiguration config = new LoggingConfiguration(); 
      config.AddTarget("FileLog", target); 
      config.LoggingRules.Add(rule); 

      LogManager.Configuration = config; 

      var _logger = LogManager.GetCurrentClassLogger(); 
      _logger.Trace("EncryptEventReceiver CTOR initialized Logger"); 
     }); 

     t.Start(); 
     t.Wait(); 

     LogManager.GetCurrentClassLogger().Trace("EncryptEventReceiver MIDDLE"); 
     LogManager.Configuration = oldConfig; 
     nlog3 = LogManager.GetCurrentClassLogger(); 
     nlog3.Trace("EncryptEventReceiver CTOR done, nlog3 ready"); 
    } 

편집 : 일부 로그를 그리워 원인이 결국 그래서 나는 웹 설정이

public static Logger nlog3; 
    private static LoggingConfiguration oldConfig; 

    public EncryptEventReceiver() 
    { 
     oldConfig = LogManager.Configuration; 

     FileTarget target = new FileTarget(); 
     target.FileName = "c:\\Data\\Logs\\MyProj\\EncryptEventReceiver.txt"; 
     target.Layout = "${date:format=yyyy-MM-dd HH\\:mm\\:ss} ${level} ${message} ${exception:format=tostring}"; 
     target.ArchiveAboveSize = 5242880; 
     target.ArchiveFileName = "c:\\Data\\Logs\\MyProj\\Archive_EncryptEventReceiver\\EncryptEventReceiver_${shortdate}_{#}.txt"; 
     target.Encoding = Encoding.UTF8; 

     LoggingRule rule = new LoggingRule("*", LogLevel.Trace, target); 

     LoggingConfiguration config = new LoggingConfiguration(); 
     config.AddTarget("FileLog", target); 
     config.LoggingRules.Add(rule); 

     LogManager.Configuration = config; 

     nlog3 = LogManager.GetCurrentClassLogger(); 
     nlog3.Trace("EncryptEventReceiver CTOR done, nlog3 ready"); 
    } 

    ~EncryptEventReceiver() 
    { 
     nlog3.Trace("EncryptEventReceiver Destructor"); 
     LogManager.Configuration = oldConfig; 
     LogManager.GetCurrentClassLogger().Trace("EncryptEventReceiver Destructor done"); 
    } 

을 권장 마시는 무거운 사용, ctor에-Destrucor에 반환