【发布时间】:2020-08-08 10:12:49
【问题描述】:
我已经在我的 .NET CORE 3.1 Web API 项目中配置了 nLog,一切正常。我想在 nLog 中使用自定义布局渲染器 ${hello-world} 但无法在日志文件中查看结果。不知道我从拼图中遗漏了什么。 https://nlog-project.org/2015/06/30/extending-nlog-is-easy.html
我的代码中是否需要以下配置?
ConfigurationItemFactory.Default.LayoutRenderers.RegisterDefinition("hello-world", typeof(HelloWorldLayoutRenderer));
程序.cs
public static void Main(string[] args)
{
var logger = NLog.Web.NLogBuilder.ConfigureNLog("nlog.config").GetCurrentClassLogger();
try
{
logger.Debug("init main");
CreateHostBuilder(args).Build().Run();
}
catch (Exception exception)
{
logger.Error(exception, "Stopped program because of exception");
throw;
}
finally
{
NLog.LogManager.Shutdown();
}
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.UseServiceProviderFactory(new AutofacServiceProviderFactory())
.ConfigureLogging((hostingContext, logging) =>
{
logging.ClearProviders();
logging.SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Trace);
})
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
})
.UseNLog();
}
服务配置
services.AddSingleton<ILoggerService, LoggerService>();
DI
containerBuilder.RegisterType<LoggerService>().As<ILoggerService>();
NLog.Config
<target xsi:type="File" name="allfile" fileName="..\logs\nlog-all-${shortdate}.log"
layout="${longdate}| ${hello-world}"> </target>
<target xsi:type="File" name="ownFile-web" fileName="..\logs\nlog-own-${shortdate}.log"
layout="${longdate}| ${environment: USERNAME}| ${hello-world}"></target>
<rules>
<logger name="*" minlevel="Trace" writeTo="allfile" />
<logger name="Microsoft.*" maxlevel="Info" final="true" />
<logger name="*" minlevel="Trace" writeTo="ownFile-web" />
</rules>
LayoutRanderer 类
[LayoutRenderer("hello-world")]
public class HelloWorldLayoutRenderer : LayoutRenderer
{
public string Config1 { get; set; }
[RequiredParameter]
public string Config2 { get; set; }
[DefaultParameter]
public bool Caps { get; set; }
protected override void Append(StringBuilder builder, LogEventInfo logEvent)
{
builder.Append("Hello World!");
}
}
LoggerService 类
public class LoggerService: ILoggerService
{
private static ILogger logger = LogManager.GetCurrentClassLogger();
private const string LoggerName = "NLogLogger";
public void LogDebug(string message)
{
logger.Debug(message);
}
public void LogError(string message)
{
logger.Error(message);
}
public void LogInfo(string message)
{
logger.Info(message);
}
public void LogWarn(string message)
{
logger.Warn(message);
}
}
Web API 控制器
[ApiController]
public class DashboardController : ControllerBase
{
private readonly ILoggerService Logger;
public DashboardController(
ILoggerService _logger
)
{
Logger = _logger;
Logger.LogDebug("NLog injected into HomeController.....");
}
/// test logs
[HttpGet]
public ActionResult<HelloMessage> GetMessage()
{
Logger.LogInfo("Here is info message from the controller.");
Logger.LogDebug("Here is debug message from the controller.");
Logger.LogWarn("Here is warn message from the controller.");
Logger.LogError("Here is error message from the controller.");
}
【问题讨论】:
标签: c# dependency-injection asp.net-web-api2 nlog asp.net-core-3.1