[英]Why does SetBasePath not work in .NET Core 3.1? I've tried adding nuget packages, but it doesn't work
[英]Why doesn't NuGet package NLog work for .NET Core?
完成以下步驟。
創建一個新的 .NET Core 控制台項目 (C# .NET Core 2.1)
添加 NuGet 包NLog , NLog.Config (目前是 V4.5.8)
在Program
類中添加記錄器字段。
static Logger logger = LogManager.GetCurrentClassLogger();
添加logger.Info("Test NLog");
在static void Main(string[] args)
。
但是,為什么運行程序不會打印“Test NLog”?
確保不要使用NLog.config NuGet 包。 已棄用,不應用於新項目(NuGet 包的說明中也有說明)。
它具有在應用程序部署時重置實際 Nlog.config 的不良副作用。 當 Microsoft 決定重新設計 NuGet 包格式時,NuGet 包就損壞了。
另請參閱: .NET Core 2 控制台應用程序入門
NLog 自 NLog 4.5 起完全支持 .NET Core 1 和 2
該問題可能是 nuget 的問題,即 nlog.config 未與 NLog.Config 包一起安裝。
您應該檢查您的 nlog.config(並部署它)。 如果它不存在,則創建它。
我建議閱讀:
但是,運行程序會不會打印“Test NLog”?
你期望輸出在哪里? 也為此檢查您的 nlog.config
NLog.Config 包不會向您的項目添加配置文件,您必須手動創建一個。 您還必須手動確保將其復制到輸出目錄。
一個簡單的配置文件如下:
<?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">
<targets>
<target name="logfile" xsi:type="File" fileName="file.txt" />
<target name="logconsole" xsi:type="Console" />
</targets>
<rules>
<logger name="*" minlevel="Info" writeTo="logconsole" />
<logger name="*" minlevel="Debug" writeTo="logfile" />
</rules>
</nlog>
確保將以下內容添加到您的 .csproj 文件中:
<ItemGroup>
<None Update="nlog.config" CopyToOutputDirectory="PreserveNewest" />
</ItemGroup>
確保類型為None
而不是Content
,如 ASP.NET 項目所示。 控制台應用程序不復制Content
文件。
另外,請確保配置文件的第一行是<?xml ...
元素。 這是一個晦澀的問題,但如果它不在第一行,NLog 將無法解析文件。
當所有其他方法都失敗時,請參閱出色的故障排除指南: https : //github.com/NLog/NLog/wiki/Logging-troubleshooting
你可能有錯誤的版本。 NuGet 頁面 ( NLog ) 提到了這一點:
支持的平台:
對於 ASP.NET Core,請檢查: NLog.Web.AspNetCore
工作 .NET Core 示例:
public class Program
{
public static void Main(string[] args)
{
// NLog: setup the logger first to catch all errors
var logger = NLog.Web.NLogBuilder.ConfigureNLog("nlog.config").GetCurrentClassLogger();
try
{
BuildWebHost(args).Run();
}
catch (Exception ex)
{
//NLog: catch setup errors
logger.Error(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 IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.ConfigureLogging(logging =>
{
logging.ClearProviders();
logging.SetMinimumLevel(LogLevel.Trace);
})
.UseNLog() // NLog: setup NLog for Dependency injection
.Build();
}
<?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"
autoReload="true"
internalLogLevel="info"
internalLogFile="c:\temp\internal-nlog.txt">
<!-- Enable ASP.NET Core layout renderers -->
<extensions>
<add assembly="NLog.Web.AspNetCore"/>
</extensions>
<!-- The targets to write to -->
<targets>
<!-- Write logs to a file -->
<target xsi:type="File" name="allfile" fileName="c:\temp\nlog-all-${shortdate}.log"
layout="${longdate}|${event-properties:item=EventId_Id}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}" />
<!-- Another file log, but only own logs. It uses some ASP.NET core renderers -->
<target xsi:type="File" name="ownFile-web" fileName="c:\temp\nlog-own-${shortdate}.log"
layout="${longdate}|${event-properties:item=EventId_Id}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}|url: ${aspnet-request-url}|action: ${aspnet-mvc-action}" />
</targets>
<!-- Rules to map from logger name to target -->
<rules>
<!-- All logs, including from Microsoft -->
<logger name="*" minlevel="Trace" writeTo="allfile" />
<!-- Skip non-critical Microsoft logs and so log only own logs -->
<logger name="Microsoft.*" maxLevel="Info" final="true" />
<!-- BlackHole without writeTo -->
<logger name="*" minlevel="Trace" writeTo="ownFile-web" />
</rules>
</nlog>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.