【问题标题】:Configure Custom Layout Renderer of nLog in .NET CORE 3.1 Web API Project在 .NET CORE 3.1 Web API 项目中配置 nLog 的自定义布局渲染器
【发布时间】: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


    【解决方案1】:

    不要这样做:

    var logger = NLog.Web.NLogBuilder.ConfigureNLog("nlog.config").GetCurrentClassLogger();
    

    然后尝试这样做:

    var logger = NLog.LogManager.Setup()
                   .SetupExtensions(s => s.AutoLoadAssemblies(false).RegisterLayoutRenderer<HelloWorldLayoutRenderer>("hello-world"))
                   .RegisterNLogWeb()
                   .LoadConfigurationFromFile("nlog.config")
                   .GetCurrentClassLogger();
    

    需要NLog.AspNetCore.Web 版本。 4.9.3

    另见:https://nlog-project.org/2020/03/28/nlog-4-7-has-been-released.html

    【讨论】:

    • 非常感谢,Rolf ...该解决方案确实对我有用...
    猜你喜欢
    • 1970-01-01
    • 2018-11-10
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-22
    • 1970-01-01
    相关资源
    最近更新 更多