[nlog]在.razor中实现日志输出并在IIS中运行时,${aspnet-request-ip}为空

a0x5cqrl  于 2022-11-12  发布在  其他
关注(0)|答案(1)|浏览(127)

我们正在以下环境中进行验证。
VS 2022 Blazor服务器.NET 6.0

  • 网络日志文件
  • 互联网信息服务

在. cshtml.cs中实现日志输出并在IIS中执行时,本地IP(::1)正常输出。仅当在.razor中实现日志输出并在IIS中运行时,$ {aspnet-request-ip}才会为null。使用VS(IIS Express)进行调试时,. cshtml.cs和.razor都正常输出。
你能告诉我我的代码有什么问题吗?
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"
      autoReload="true"
      internalLogLevel="Info"
      internalLogFile="${basedir}/logs/internal-nlog-BlazorNLogTest.txt"
      internalLogToConsole="true">

  <!-- enable asp.net core layout renderers -->
  <extensions>
    <add assembly="NLog.Web.AspNetCore"/>
  </extensions>

  <!-- the targets to write to -->
  <targets>
    <!-- File Target for own log messages with extra web details using some ASP.NET core renderers -->
    <target xsi:type="File" name="logFile" fileName="${aspnet-appbasepath}/logs/nlog-BlazorNLogTest-${shortdate}.log"
            layout="${longdate}|${aspnet-request-ip}||${event-properties:item=EventId_Id:whenEmpty=0}|${level:uppercase=true}|${logger}|${message} ${exception:format=tostring}|url: ${aspnet-request-url}|action: ${aspnet-mvc-action}|${callsite}" />
  </targets>

  <!-- rules to map from logger name to target -->
  <rules>
    <!--Skip non-critical Microsoft logs and so log only own logs (BlackHole) -->
    <logger name="Microsoft.*" maxlevel="Info" final="true" />
    <logger name="System.Net.Http.*" maxlevel="Info" final="true" />

    <logger name="*" minlevel="Trace" writeTo="logFile" />
  </rules>
</nlog>

Program.cs

using BlazorNLogTest.Data;
using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.Components.Web;
using NLog;
using NLog.Web;

// load nlog.config
var logger = NLog.LogManager.Setup().LoadConfigurationFromAppSettings().GetCurrentClassLogger();
logger.Debug("init main");

try
{
    var builder = WebApplication.CreateBuilder(args);

    // DI NLog to ILogger
    builder.Logging.ClearProviders();
    builder.Logging.SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Trace);
    builder.Host.UseNLog();

    // Add services to the container.
    builder.Services.AddRazorPages();
    builder.Services.AddServerSideBlazor();
    builder.Services.AddSingleton<WeatherForecastService>();

    var app = builder.Build();

    // Configure the HTTP request pipeline.
    if (!app.Environment.IsDevelopment())
    {
        app.UseExceptionHandler("/Error");
    }

    app.UseStaticFiles();

    app.UseRouting();

    app.MapBlazorHub();
    app.MapFallbackToPage("/_Host");

    app.Run();
}
catch (Exception exception)
{
    // catch setup errors
    logger.Error(exception, "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();
}

Counter.razor

@page "/counter"

@inject ILogger<Counter> _logger

<PageTitle>Counter</PageTitle>

<h1>Counter</h1>

<p role="status">Current count: @currentCount</p>

<button class="btn btn-primary" @onclick="IncrementCount">Click me</button>

@code {
    private int currentCount = 0;

    private void IncrementCount()
    {
        currentCount++;

        // Log output (${aspnet-request-ip} is not output when running on IIS)
        _logger.LogDebug("Click!(COUNT={0})", currentCount.ToString());
    }
}

Test.cshtml.cs

using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel;

namespace BlazorNLogTest.Pages;

public class TestModel : PageModel
{
    [BindProperty]
    [DisplayName("UserId")]
    [Required]
    [StringLength(5)]
    public string? UserId { get; set; }

    private ILogger<TestModel> _logger { get; set; }

    public TestModel(ILogger<TestModel> logger)
    {
        _logger = logger;
    }

    public IActionResult OnPost()
    {
        if (ModelState.IsValid is false) return Page();

        // Validate
        if (!(UserId ?? "").Equals("12345"))
        {
            // Log output (${aspnet-request-ip} is output even if executed in IIS)
            _logger.LogDebug(string.Format("NG!(ID={0})", UserId));
            return Page();
        }

        // Log output (${aspnet-request-ip} is output even if executed in IIS)
        _logger.LogDebug(string.Format("OK!(ID={0}, NAME={1})",UserId, "H-Mitsumura"));

        return Redirect(Url.Content("~" + "/"));
    }
}

IIS输出日志(摘录)

2022-07-06 16:35:01.2213|||0|DEBUG|Program|init main
2022-07-06 16:35:01.7629|||0|WARN|Microsoft.AspNetCore.DataProtection.Repositories.EphemeralXmlRepository|Using an in-memory repository. Keys will not be persisted to storage.
2022-07-06 16:35:01.7629|||0|WARN|Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager|Neither user profile nor HKLM registry available. Using an ephemeral key repository. Protected data will be unavailable when application exits.
2022-07-06 16:35:01.9215|||0|WARN|Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager|No XML encryptor configured. Key {6e1761d8-4dea-4c4e-82c5-43f72c923ecd} may be persisted to storage in unencrypted form.
2022-07-06 16:35:07.0661|||0|DEBUG|BlazorNLogTest.Pages.Counter|Click!(COUNT=1)
2022-07-06 16:35:07.5282|||0|DEBUG|BlazorNLogTest.Pages.Counter|Click!(COUNT=2)
2022-07-06 16:35:07.9429|||0|DEBUG|BlazorNLogTest.Pages.Counter|Click!(COUNT=3)
2022-07-06 16:35:08.2966|||0|DEBUG|BlazorNLogTest.Pages.Counter|Click!(COUNT=4)
2022-07-06 16:35:08.6971|||0|DEBUG|BlazorNLogTest.Pages.Counter|Click!(COUNT=5)
2022-07-06 16:35:10.4251|::1||0|ERROR|Microsoft.AspNetCore.Antiforgery.DefaultAntiforgery|An exception was thrown while deserializing the token. Microsoft.AspNetCore.Antiforgery.AntiforgeryValidationException: The antiforgery token could not be decrypted.
2022-07-06 16:35:15.5001|::1||0|DEBUG|BlazorNLogTest.Pages.TestModel|NG!(ID=11111)
2022-07-06 16:35:20.6906|::1||0|DEBUG|BlazorNLogTest.Pages.TestModel|NG!(ID=12222)
2022-07-06 16:35:25.7533|::1||0|DEBUG|BlazorNLogTest.Pages.TestModel|OK!(ID=12345, NAME=H-Mitsumura)

IIS Express输出日志(摘录)

2022-07-06 16:40:12.9021|::1||0|DEBUG|BlazorNLogTest.Pages.Counter|Click!(COUNT=1)
2022-07-06 16:40:13.6856|::1||0|DEBUG|BlazorNLogTest.Pages.Counter|Click!(COUNT=2)
2022-07-06 16:40:14.3859|::1||0|DEBUG|BlazorNLogTest.Pages.Counter|Click!(COUNT=3)
2022-07-06 16:40:15.2128|::1||0|DEBUG|BlazorNLogTest.Pages.Counter|Click!(COUNT=4)
2022-07-06 16:40:15.9525|::1||0|DEBUG|BlazorNLogTest.Pages.Counter|Click!(COUNT=5)
2022-07-06 16:40:21.5225|::1||0|DEBUG|BlazorNLogTest.Pages.TestModel|NG!(ID=11111)
2022-07-06 16:40:25.7890|::1||0|DEBUG|BlazorNLogTest.Pages.TestModel|NG!(ID=12222)
2022-07-06 16:40:30.6269|::1||0|DEBUG|BlazorNLogTest.Pages.TestModel|OK!(ID=12345, NAME=H-Mitsumura)

我把所有的源代码和输出日志放在GitHub上。https://github.com/H-Mitsumura/desktop-tutorial.git
就这样。
很久没见了,不过还是谢谢你.

svmlkihl

svmlkihl1#

是自我解决的。
现在启用IIS“WebSocket协议”时输出IP(::1),似乎VS(IIS Express)中始终启用“WebSocket协议”,从现在开始,如果结果与VS(IIS Express)不同,我将对此表示怀疑。
IIS输出日志(摘录)

2022-07-20 16:38:55.2172|||0|DEBUG|Program|init main
2022-07-20 16:38:55.6727|||0|WARN|Microsoft.AspNetCore.DataProtection.Repositories.EphemeralXmlRepository|Using an in-memory repository. Keys will not be persisted to storage.
2022-07-20 16:38:55.6727|||0|WARN|Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager|Neither user profile nor HKLM registry available. Using an ephemeral key repository. Protected data will be unavailable when application exits.
2022-07-20 16:38:55.7914|||0|WARN|Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager|No XML encryptor configured. Key {c9903561-9d52-439b-92ae-2d4c2cacdb05} may be persisted to storage in unencrypted form.
2022-07-20 16:39:03.2765|::1||0|DEBUG|BlazorNLogTest.Pages.Counter|Click!(COUNT=1)
2022-07-20 16:39:03.4868|::1||0|DEBUG|BlazorNLogTest.Pages.Counter|Click!(COUNT=2)
2022-07-20 16:39:03.7255|::1||0|DEBUG|BlazorNLogTest.Pages.Counter|Click!(COUNT=3)
2022-07-20 16:39:04.0255|::1||0|DEBUG|BlazorNLogTest.Pages.Counter|Click!(COUNT=4)
2022-07-20 16:39:04.6658|::1||0|DEBUG|BlazorNLogTest.Pages.Counter|Click!(COUNT=5)
2022-07-20 16:39:05.9962|::1||0|ERROR|Microsoft.AspNetCore.Antiforgery.DefaultAntiforgery|An exception was thrown while deserializing the token. Microsoft.AspNetCore.Antiforgery.AntiforgeryValidationException: The antiforgery token could not be decrypted.
2022-07-20 16:39:11.3973|::1||0|DEBUG|BlazorNLogTest.Pages.TestModel|NG!(ID=11111)
2022-07-20 16:39:15.4945|::1||0|DEBUG|BlazorNLogTest.Pages.TestModel|NG!(ID=12222)
2022-07-20 16:39:19.7572|::1||0|DEBUG|BlazorNLogTest.Pages.TestModel|OK!(ID=12345, NAME=H-Mitsumura)

麻烦你了

相关问题