c# - RavenDb NLog 配置冲突

标签 c# ravendb nlog

我想使用 NLog 记录到 RavenDb 数据库。显然没有现有的 NLog 目标(根据 this 和搜索),所以我尝试编写自己的目标。我一直与 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");

但是,RavenDb 也使用 NLog.config,因此当我将对 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 的使用配合良好?

最佳答案

找到了。我错过了目标类上的 Target 属性,如图所示 here .

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

传递给 Target 属性的名称参数是您在配置文件中引用为“type”的参数:

<?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");

关于c# - RavenDb NLog 配置冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12109821/

相关文章:

c# - 挑战 : C# Foreach - Before, After, Even, Odd, Last, First

c# - Visual Studio 可扩展性,如何枚举解决方案中的项目?

ravendb - RavenDB 动态查询中的谓词无法正常工作

c# - NLog MappedDiagnosticsLogicalContext 不工作在异步/等待与 ConfigureAwait(false)

asp.net - NLog - 如何记录所有请求信息

c# - Entity Framework - 根据另一个表中的 ID 获取实体名称

mongodb - 文档数据库 : data model migrations

ravendb - 在RavenDB中更新文档

asp.net-mvc - NLog、Elmah + 共享库

c# - Entity Framework 从 View 加载保存到表