首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用DI和appsettings.json将Nlog日志记录到数据库.NET 5.0

使用DI和appsettings.json将Nlog日志记录到数据库.NET 5.0
EN

Stack Overflow用户
提问于 2021-11-15 13:52:20
回答 2查看 197关注 0票数 0

我一直在尝试让Nlog将日志记录发送到数据库,但我找到的示例都返回了一个内部nlog错误。我在.NET 5.0中的控制台应用程序中使用依赖注入...:

代码语言:javascript
运行
复制
Info Adding target ConsoleTarget(Name=console)
Warn Error has been raised. Exception: NLog.NLogConfigurationException: Failed to create Target of type: Database
 ---> System.ArgumentException: Target cannot be found: 'Database'. Extension NLog.Database not included?
   at NLog.Config.Factory`2.CreateInstance(String itemName)
   at NLog.Config.LoggingConfigurationParser.FactoryCreateInstance[T](String classType, INamedItemFactory`2 factory)
   --- End of inner exception stack trace ---
Warn Error has been raised. Exception: NLog.NLogConfigurationException: Target 'dbTarget' not found for logging rule: *.

在我的json中,我有以下内容:

代码语言:javascript
运行
复制
  "NLog": {
    "internalLogLevel": "info",
    "internalLogFile": "${basedir}/logs/internal-nlog.txt",
    "extensions": {
      "NLog.Extensions.Logging": {
        "assembly": "NLog.Web.AspNetCore"
      }
    },
    "targets": {
      "database": {
        "type": "Database",
        "name": "dbTarget",
        "dbProvider": "Microsoft.Data.SqlClient.SqlConnection,Microsoft.Data.SqlClient",
        "connectionString": "myconnectionstring",
        "commandText": "INSERT INTO dbo.Logs (Level,CallSite,Type,Message,StackTrace,InnerException,AdditionalInfo) values (@level, @callSite, @type, @message, @stackTrace, @innerException, @additionalInfo)",
        "parameters": [
          {
            "lots of parameters follow"
          }
        ]

      }
    },
    "rules": [
      {
        "logger": "*",
        "minLevel": "Debug",
        "writeTo": "dbTarget"
      }
    ]

这是在我的Main()中:

代码语言:javascript
运行
复制
        static void Main(string[] args)
        {
            ApplicationSettings applicationSettings = new ApplicationSettings();

            var settings = applicationSettings.GetConfiguration();

            var host = Host.CreateDefaultBuilder()
            .ConfigureServices((context, services) =>
            {
                services.AddSingleton<IApplicationSettings, ApplicationSettings>();
                services.AddSingleton<IApplication, Application>();
                services.AddSingleton<ITeamMemberProcessor, TeamMemberProcessor>();
                services.AddLogging(loggingBuilder =>
                {
                    loggingBuilder.ClearProviders();
                    loggingBuilder.AddNLog();
                });
            })
            .Build();
            

            var svc = ActivatorUtilities.CreateInstance<Application>(host.Services);
            svc.Run();
        }

我是不是遗漏了什么?写入文件和写入控制台工作正常。另外,据我所知,nlog.config不应该再被使用了。我们应该使用appsettings.json吗?

谢谢!

戴夫

EN

回答 2

Stack Overflow用户

发布于 2021-11-15 19:02:52

我猜您使用的是NLog 5.0,其中的NLog DatabaseTarget是extracted into a seperate nuget-package

猜猜错误消息试图表达的意思:

代码语言:javascript
运行
复制
Exception: NLog.NLogConfigurationException: Failed to create Target of type: Database
 ---> System.ArgumentException: Target cannot be found: 'Database'. Extension NLog.Database not included?

它希望您从nuget安装扩展NLog.Database,并将其添加到NLog配置中。如下所示:

代码语言:javascript
运行
复制
"NLog": {
    "internalLogLevel": "info",
    "internalLogFile": "${basedir}/logs/internal-nlog.txt",
    "extensions": [
      { "assembly": "NLog.Database" },
      { "assembly": "NLog.Web.AspNetCore" }
    ],
    "targets": {
        "database": {
        "type": "Database",
        "name": "dbTarget",
        "dbProvider": "Microsoft.Data.SqlClient.SqlConnection,Microsoft.Data.SqlClient",
        "connectionString": "myconnectionstring",
        "commandText": "INSERT INTO dbo.Logs (Level,CallSite,Type,Message,StackTrace,InnerException,AdditionalInfo) values (@level, @callSite, @type, @message, @stackTrace, @innerException, @additionalInfo)",
        "parameters": [
            {
            "lots of parameters follow"
            }
        ]

        }
    },
    "rules": [
        {
        "logger": "*",
        "minLevel": "Debug",
        "writeTo": "dbTarget"
        }
    ]
}
票数 1
EN

Stack Overflow用户

发布于 2021-11-16 12:22:17

所以,我能够让它“工作”,尽管没有DI..我仍然想弄清楚这一点。看起来好像我的ApplicationSettings中少了两行:

代码语言:javascript
运行
复制
            LogManager.Configuration = new NLogLoggingConfiguration(_configuration.GetSection("NLog"));
            var logger = NLogBuilder.ConfigureNLog(LogManager.Configuration).GetCurrentClassLogger();

然后在我的"Application“类中,我删除了日志注入,并在我的"Run”方法的顶部添加了以下内容:

代码语言:javascript
运行
复制
var _logger = LogManager.Setup().LoadConfigurationFromSection(_configuration).GetCurrentClassLogger();

然后它起作用了..再一次,我猜我遗漏了一些东西,所以我可以使用依赖注入?但我不确定..。

谢谢你的回复,感谢你抽出时间来!

戴夫

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69975487

复制
相关文章

相似问题

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