2

NLog を使用して 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 でも使用されるため、Target への参照をそこに入れると、Store.Initialize() で例外がスローされます。NLog.config で試したのは次のとおりです (NLog.RavenDb は、RavenDb ターゲットを含むライブラリ プロジェクトの名前です)。

<?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 の使用で適切に再生するにはどうすればよいですか?

4

1 に答える 1

4

それを見つけた。hereに示されているように、ターゲット クラスの Target 属性がありませんでした。

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

Target 属性に渡す名前パラメーターは、構成ファイルで「タイプ」として参照するものです。

<?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 を自動的に取得するため、追加の構成コードは必要ありません。テスト コンソール アプリのメイン メソッドの内容は次のとおりです。

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

        Logger logger = LogManager.GetLogger("Any");
        logger.Info("Hi");
于 2012-09-04T13:31:33.733 に答える