2012-08-24 6 views
2

NLog를 사용하여 RavenDb 데이터베이스에 로그인하고 싶습니다. 이 경우 기존 NLog Target이 존재하지 않으므로 (this 및 검색에 따라) 내 자신의 글을 쓰려고합니다. 나는 RavenDb 클라이언트의 NLog 설정과 계속 충돌하고 있으며이를 해결하는 방법을 찾을 수는 없습니다. 여기 내 대상의 :RavenDb NLog 설정 충돌

namespace NLog.RavenDb 
{ 
    class LogEntry 
    { 
     public string Id { get; set; } 
     public Exception Exception { get; set; } 
     public string LogLevel { get; set; } 
     public StackTrace StackTrace { get; set; } 
     public DateTimeOffset TimeStamp { get; set; } 
     public string Message { get; set; } 
    } 

    public class RavenDbTarget : NLog.Targets.TargetWithLayout 
    { 
     public static IDocumentStore Store { get; set; } 

     protected override void Write(LogEventInfo logEvent) 
     { 
      if (Store == null) 
      { 
       const string noStoreWarning = "No Document Store set for the RavenDb Log target"; 
       Debug.WriteLine(noStoreWarning); 
       return; 
      } 

      LogEntry entry = new LogEntry 
      { 
       Exception = logEvent.Exception, 
       LogLevel = logEvent.Level.Name, 
       Message = logEvent.FormattedMessage, 
       StackTrace = logEvent.StackTrace, 
       TimeStamp = new DateTimeOffset(logEvent.TimeStamp) 
      }; 

      using (var session = Store.OpenSession()) 
      { 
       session.Store(entry); 
       session.SaveChanges(); 
      } 
     } 
    } 
} 

그리고 여기 나는 그것이 SimpleConfigurator 작업을 얻을 수있는 방법은 다음과 같습니다

RavenDbTarget.Store = new DocumentStore { Url = "http://localhost:8080/" }; 
RavenDbTarget.Store.Initialize(); 

NLog.Config.SimpleConfigurator.ConfigureForTargetLogging(new RavenDbTarget()); 
Logger logger = NLog.LogManager.GetLogger("Any"); 
logger.Info("Hi"); 

그러나, NLog.config 너무 RavenDb에 의해 사용되는, 그래서 난 내 대상에 대한 참조를 넣을 때 거기에 Store.Initialize() 예외가 throw됩니다.

<?xml version="1.0" encoding="utf-8" ?> 
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 

    <extensions> 
     <add assembly="Nlog.RavenDb"/> 
    </extensions> 

    <targets> 
     <target xsi:type="NLog.RavenDb.RavenDbTarget" name="Raven"/> 
     <target xsi:type="File" name="f" fileName="${basedir}/logs/${shortdate}.log" 
       layout="${longdate} ${uppercase:${level}} ${message}" /> 
    </targets> 

    <rules> 
     <logger minlevel="Trace" name="Any" writeTo="Raven" /> 
    </rules> 
</nlog> 

가 어떻게 내 NLog.config 파일이 그것의 RavenDb의 사용과 멋진 플레이 할 수 있습니다 : 여기 NLog.config에서 재판을 무엇 (NLog.RavenDb는 RavenDb 대상을 포함하는 내 라이브러리 프로젝트의 이름입니다)?

답변

4

발견. here과 같이 내 대상 클래스의 대상 특성을 놓쳤습니다. '

<?xml version="1.0" encoding="utf-8" ?> 
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 

    <extensions> 
     <add assembly="Nlog.RavenDb"/> 
    </extensions> 

    <targets> 
     <target xsi:type="RavenDb" name="Raven"/> 
    </targets> 

    <rules> 
     <logger minlevel="Trace" name="Any" writeTo="Raven" /> 
    </rules> 
</nlog> 

지금 NLog가 자동으로 NLog.config을 집어 들고, 나는 돈 :

[NLog.Targets.Target("RavenDb")] 
public class RavenDbTarget : NLog.Targets.TargetWithLayout 

대상 속성에 전달하는 이름 매개 변수는 설정 파일에서 "유형"으로 참조하는 하나입니다 추가 설정 코드가 필요 없습니다. 내 테스트 콘솔 앱의 기본 메소드의 내용은 다음과 같습니다.

 RavenDbTarget.Store = new DocumentStore { Url = "http://localhost:8080/" }; 
     RavenDbTarget.Store.Initialize(); 

     Logger logger = LogManager.GetLogger("Any"); 
     logger.Info("Hi"); 
+0

니스, 나는 이것을 찾고있었습니다. – user981375