我一直在尝试让Nlog将日志记录发送到数据库,但我找到的示例都返回了一个内部nlog错误。我在.NET 5.0中的控制台应用程序中使用依赖注入...:
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中,我有以下内容:
"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()中:
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吗?
谢谢!
戴夫
发布于 2021-11-15 19:02:52
我猜您使用的是NLog 5.0,其中的NLog DatabaseTarget是extracted into a seperate nuget-package。
猜猜错误消息试图表达的意思:
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配置中。如下所示:
"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"
}
]
}
发布于 2021-11-16 12:22:17
所以,我能够让它“工作”,尽管没有DI..我仍然想弄清楚这一点。看起来好像我的ApplicationSettings中少了两行:
LogManager.Configuration = new NLogLoggingConfiguration(_configuration.GetSection("NLog"));
var logger = NLogBuilder.ConfigureNLog(LogManager.Configuration).GetCurrentClassLogger();
然后在我的"Application“类中,我删除了日志注入,并在我的"Run”方法的顶部添加了以下内容:
var _logger = LogManager.Setup().LoadConfigurationFromSection(_configuration).GetCurrentClassLogger();
然后它起作用了..再一次,我猜我遗漏了一些东西,所以我可以使用依赖注入?但我不确定..。
谢谢你的回复,感谢你抽出时间来!
戴夫
https://stackoverflow.com/questions/69975487
复制相似问题