首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RavenDb NLog配置冲突

RavenDb NLog配置冲突
EN

Stack Overflow用户
提问于 2012-08-24 20:55:46
回答 1查看 900关注 0票数 2

我想使用NLog登录到RavenDb数据库。显然没有现有的NLog目标(根据this和搜索),所以我正在尝试编写我自己的。我总是与RavenDb客户端自己的NLog配置发生冲突,并且我不知道如何解决这个问题。这是我的目标:

代码语言:javascript
复制
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一起工作的方法:

代码语言:javascript
复制
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,所以当我在其中放入对我的目标的引用时,它会在Store.Initialize()抛出一个异常。下面是我在NLog.config中尝试的方法(NLog.RavenDb是包含RavenDb目标的库项目的名称):

代码语言:javascript
复制
<?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的使用更好呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-09-04 21:31:34

找到了。我遗漏了目标类上的目标属性,如here所示。

代码语言:javascript
复制
[NLog.Targets.Target("RavenDb")]
public class RavenDbTarget : NLog.Targets.TargetWithLayout

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

代码语言:javascript
复制
<?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,我不需要任何额外的配置代码。下面是我的测试控制台应用程序的main方法的内容:

代码语言:javascript
复制
        RavenDbTarget.Store = new DocumentStore { Url = "http://localhost:8080/" };
        RavenDbTarget.Store.Initialize();

        Logger logger = LogManager.GetLogger("Any");
        logger.Info("Hi");
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12109821

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档