首页 > 解决方案 > Azure Linux WebApp 网络核心日志记录到磁盘工作示例

问题描述

有人可以提供一个工作示例,说明如何在运行简单控制台 webapi 项目的 linux azure webapp 上登录到磁盘。

我想将以下内容记录到磁盘。

控制台、调试、ILogger

我找不到任何显示 CreateHostBuilder、appsettings.json 和 azure Blade 设置中所需内容的示例。

我读过的所有东西似乎都适用于 Windows,不适用于 Linux。

我尝试了以下方法:

public static IHostBuilder CreateHostBuilder(string[] args)
{
    var host = Host.CreateDefaultBuilder(args)
        .ConfigureLogging(logging => logging.AddAzureWebAppDiagnostics())
        .ConfigureServices(serviceCollection => serviceCollection
            .Configure<AzureFileLoggerOptions>(options =>
            {
                options.FileName = "azure-diagnostics-";
                options.FileSizeLimit = 50 * 1024;
                options.RetainedFileCountLimit = 5;
            })
            .Configure<AzureBlobLoggerOptions>(options =>
            {
                options.BlobName = "log.txt";
            }))
        .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); });

appsettings.json 是否需要 FilePath?路径格式是什么?

{

  "Logging": {
    "FilePath": "LogFiles",
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },

site/diagnostics/settings.json 这会覆盖 appsettings.json 吗?反之亦然?什么是什么?

"AzureDriveEnabled":false,
"AzureDriveTraceLevel":"Verbose",
"AzureTableEnabled":false,
"AzureTableTraceLevel":"Error",
"AzureBlobEnabled":true,
"AzureBlobTraceLevel":"Verbose"
}

在此处输入图像描述

然而,当我检查我的 FTP 日志位置时,我只看到以下关于 docker 部署和其他无用的内容。

在此处输入图像描述

我很高兴使用 serilog 或任何有效的东西。我目前什至无法通过 azure app 刀片上的日志流查看日志。

标签: linuxazureasp.net-coreazure-web-app-service

解决方案


我们将 nlog 用于在 linux 容器上运行的应用程序。希望这对您有所帮助。

<?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="/fluentd/etc/log/internal/internal-nlog.log">

  <variable name="logFolderName" value="log" />
  <variable name="logBaseDirectory" value="/fluentd/etc/" />
  <variable name="logDirectory" value="${logBaseDirectory}${logFolderName}"/>
  <variable name="appname" value="Docker utility"/>

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

  <!-- the targets to write to -->
  <targets>
    <!-- for dev debug purposes -->
    <target xsi:type="ColoredConsole" name="console" />
    <!-- write to file -->
    <target xsi:type="File" name="allData" fileName="${logDirectory}/all/${shortdate}.log" layout="${longdate}|${event-properties:item=EventId_Id}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}" />
    <!-- another file log. Uses some ASP.NET core renderers -->
    <target xsi:type="File" name="ownData" fileName="${logDirectory}/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}" />
  </targets>

  <!-- rules to map from logger name to target -->
  <rules>
    <!--All logs, including from Microsoft-->
    <logger name="*" minlevel="Trace" writeTo="allData" />
    <logger name="*" minlevel="Trace" writeTo="console" />
    <!--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="ownData" />
  </rules>
</nlog>

然后在Program.cs中配置nlog

using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Server.Kestrel.Core;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using NLog.Web;
using System;

var logger = NLogBuilder.ConfigureNLog("nlog.config").GetCurrentClassLogger();
try
{
    logger.Debug("init main");
    Host.CreateDefaultBuilder()
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder
                .ConfigureKestrel(serverOptions =>
                {
                    serverOptions.Limits.MaxConcurrentConnections = 100;
                })
                .UseStartup<Startup>();
            })
            .ConfigureLogging(logging =>
            {
                logging.ClearProviders();
                logging.SetMinimumLevel(LogLevel.Trace);
            })
            .UseNLog()
            .Build()
            .Run();
}
catch (Exception exception)
{
    //NLog: 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();
}

日志文件

结果会是这样

2021-07-08 14:09:52.6206||DEBUG| test.Api.Program|init main 

推荐阅读