.net-core - .net core 2.2 从 Main 写入 NLog,但不从控制器写入
问题描述
我正在使用 NLog 编写一个 .net core 2.2 MVC 应用程序。从 Main 函数中,应用程序写入所有级别的 NLog,但从控制器中,没有写入任何内容。
appsettings.json 中的日志记录部分:
"Logging": {
"LogLevel": {
"Default": "Trace",
"Microsoft": "Information"
}
}
日志配置:
public static class NlogConfig
{
public static LoggingConfiguration GetLoggingConfiguration()
{
var logConfig = new LoggingConfiguration();
var consoleTarget = new ColoredConsoleTarget("consoleTarget")
{
Layout = @"${date:format=HH\:mm\:ss} ${level} ${message} ${exception}"
};
logConfig.AddTarget(consoleTarget);
logConfig.AddRuleForAllLevels(consoleTarget);
var fatalTarget = new FileTarget("fatal")
{
FileName = "${basedir}/logs/${shortdate}/fatal-${shortdate}.log",
Layout = "${longdate}|${event-properties:item=EventId_Id}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}|url: ${aspnet-request-url}|action: ${aspnet-mvc-action}"
};
logConfig.AddTarget(fatalTarget);
logConfig.AddRuleForOneLevel(LogLevel.Fatal, fatalTarget);
var errorTarget = new FileTarget("error")
{
FileName = "${basedir}/logs/${shortdate}/error-${shortdate}.log",
Layout = "${longdate}|${event-properties:item=EventId_Id}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}|url: ${aspnet-request-url}|action: ${aspnet-mvc-action}"
};
logConfig.AddTarget(errorTarget);
logConfig.AddRuleForOneLevel(LogLevel.Error, errorTarget);
var warningTarget = new FileTarget("warning")
{
FileName = "${basedir}/logs/${shortdate}/warning-${shortdate}.log",
Layout = "${longdate}|${event-properties:item=EventId_Id}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}|url: ${aspnet-request-url}|action: ${aspnet-mvc-action}"
};
logConfig.AddTarget(warningTarget);
logConfig.AddRuleForOneLevel(LogLevel.Warn, warningTarget);
var infoTarget = new FileTarget("info")
{
FileName = "${basedir}/logs/${shortdate}/info-${shortdate}.log",
Layout = "${longdate}|${event-properties:item=EventId_Id}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}|url: ${aspnet-request-url}|action: ${aspnet-mvc-action}"
};
logConfig.AddTarget(infoTarget);
logConfig.AddRuleForOneLevel(LogLevel.Info, infoTarget);
var debugTarget = new FileTarget("debug")
{
FileName = "${basedir}/logs/${shortdate}/debug-${shortdate}.log",
Layout = "${longdate}|${event-properties:item=EventId_Id}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}|url: ${aspnet-request-url}|action: ${aspnet-mvc-action}"
};
logConfig.AddTarget(debugTarget);
logConfig.AddRuleForOneLevel(LogLevel.Debug, debugTarget);
var traceTarget = new FileTarget("trace")
{
FileName = "${basedir}/logs/${shortdate}/trace-${shortdate}.log",
Layout = "${longdate}|${event-properties:item=EventId_Id}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}|url: ${aspnet-request-url}|action: ${aspnet-mvc-action}"
};
logConfig.AddTarget(traceTarget);
logConfig.AddRuleForOneLevel(LogLevel.Trace, traceTarget);
var allTarget = new FileTarget("all")
{
FileName = "${basedir}/logs/${shortdate}/all-${shortdate}.log",
Layout = "${longdate}|${event-properties:item=EventId_Id}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}|url: ${aspnet-request-url}|action: ${aspnet-mvc-action}"
};
logConfig.AddTarget(allTarget);
logConfig.AddRuleForAllLevels(allTarget);
return logConfig;
}
我的主要功能: public static void Main(string[] args) {
// NLog: setup the logger first to catch all errors
var logConfig = NlogConfig.GetLoggingConfiguration();
var logger = NLog.Web.NLogBuilder.ConfigureNLog(logConfig).GetCurrentClassLogger();
try
{
logger.Debug("init main");
logger.Trace("startup - trace logging test");
logger.Info("startup - info logging test");
logger.Warn("startup - warn logging test");
logger.Error("startup - error logging test");
logger.Fatal("startup - fatal logging test");
CreateWebHostBuilder(args).Build().Run();
}
catch (Exception ex)
{
logger.Fatal(ex, "Stopped program because of exception");
throw;
}
finally
{
// Ensure to flush and stop internal timers/threads before application-exit (Avoid segmentation fault on Linux)
NLog.LogManager.Shutdown();
}
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.ConfigureLogging(logging =>
{
logging.ClearProviders();
logging.SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Trace);
}).UseNLog(); // NLog: setup NLog for Dependency injection
}
和一个示例控制器:
[ApiController]
[Route("/api/app/parts")]
public class AppPartsController : ControllerBase
{
private readonly ILogger<AppPartsController> _logger;
private IPartsRepository _partsRepo;
public AppPartsController(ILogger<AppPartsController> logger, IPartsRepository repo)
{
_logger = logger;
_partsRepo = repo;
}
[HttpGet]
public async Task<ActionResult> Get()
{
_logger.LogInformation("/api/app/parts has been reached");
try
{
var partsDb = await _partsRepo.GetAllParts();
var parts = Mapper.Map<IEnumerable<AppPartDto>>(partsDb);
return Ok(parts);
}
catch (Exception ex)
{
_logger.LogError(ex, "error in AppPartsController, get all parts ");
return StatusCode(500);
}
}
}
无论我做什么,“主要”中的所有日志条目都已写入,但控制器条目未写入。
afaik,NLog 是按照他们的说明配置的,但显然我在这里遗漏了一些东西......
谢谢,
尼尔
解决方案
好吧,配置混乱。
当我更深入地查看调试文件夹时,我突然发现日志文件是在不应该生成的地方生成的,并且在我的 NLog 代码配置中使用了不同的命名约定。
这导致我在广泛的文件中寻找 rouge 配置文件 - 随后发现潜伏在项目文件夹中,从项目中删除后,但没有从文件系统中删除。
然后我继续在我的代码中搜索所述配置文件的用法,并在我的所有存储库中找到它们。
将存储库转换为使用正确的代码配置后,一切都已修复,并且恢复了和平与秩序。
我还更新了 appsettings.json 中的日志记录部分,使其看起来像这样(但我不确定它是否有任何影响):
"Logging": {
"LogLevel": {
"Default": "Trace",
"Microsoft": "Trace"
}
}
推荐阅读
- javascript - 如何使用购买历史查询 mongodb 以构建汇集的项目
- asp.net - 客户端断开连接时 ASP.NET Web API 内部服务器错误
- python - setuptools 中的 package_data 有什么用途?
- ruby-on-rails - 保存后未更新父级的rails has_many关系
- python - astropy Tables ascii 输出的简单格式化
- discord.js - 在嵌入中提及
- delphi - DFM 文件中的属性顺序是否重要?
- angular - 如何使用管道将货币汇率转换为选定的货币类型?
- mongodb - Amazon DocumentDB 是否支持 BI 连接器?
- excel - 如何使用列名在 Excel 过滤表中选择多个不相邻的列