繁体   English   中英

将 Serilog 添加到 Azure Function 应用程序并记录到文件?

[英]Adding Serilog to Azure Function App and logging to a file?

我正在尝试将 Serilog 添加到 Azure Function 应用程序(.Net 6.0)中,当然它不会写入文件。 当我运行程序时,我可以在控制台中看到“[15:58:00 INF] Hello World.”? 那么为什么不查看文件:我的另一个问题是为什么我看到“[16:03?24 INF] null”。 我的长期目标是登录到 Azure 上的 blob。 谢谢您的帮助。

using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using System;
using Serilog;
using Serilog.Events;
using Serilog.Extensions.Logging;
using SerilogFunctionApp;
using ILogger = Microsoft.Extensions.Logging.ILogger;

[assembly: WebJobsStartup(typeof(Startup))]

namespace SerilogFunctionApp
{
  public class Startup : IWebJobsStartup
  {
    public void Configure(IWebJobsBuilder builder)
    {
      string basedir = AppDomain.CurrentDomain.BaseDirectory;

      Log.Logger = new LoggerConfiguration()
          .MinimumLevel.Information()
          .WriteTo.Console()
          .WriteTo.Debug()
          .WriteTo.File(basedir + "/logs/log-.txt", rollingInterval: RollingInterval.Day, rollOnFileSizeLimit: true)
        .CreateLogger();

      builder.Services.AddLogging(lb => { lb.AddSerilog(Log.Logger, true); });
    }
  }

  public class Function1
  {
    //other code
    private ILogger _log;

    public Function1(ILoggerFactory loggerFactory)
    {
      _log = loggerFactory.CreateLogger<Function1>();
    }
    
    [FunctionName("Function1")]
    public void Run([TimerTrigger("0 */1 * * * *")] TimerInfo myTimer, ILogger log)
    {
      _log.LogInformation($"C# Timer trigger function executed at: {DateTime.Now}");

      Log.Information("Hello World!");
    }
  }
}

我发现了一个关于将启动添加到 function 的 StackOverflow,它看起来与我在上面发布的内容不同,所以我尝试修改我的应用程序,但仍然没有记录到文件中。

using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using System;
using Microsoft.Azure.Functions.Extensions.DependencyInjection;
using Microsoft.Azure.WebJobs;
using Serilog;
using ILogger = Microsoft.Extensions.Logging.ILogger;

[assembly: FunctionsStartup(typeof(SerilogFunctionApp.Startup))]

namespace SerilogFunctionApp
{
  public class Startup : FunctionsStartup
  {
    public override void ConfigureAppConfiguration(IFunctionsConfigurationBuilder builder)
    {
      var context = builder.GetContext();

      //builder.ConfigurationBuilder
      //  .AddJsonFile(Path.Combine(context.ApplicationRootPath, "appsettings.json"), optional: true, reloadOnChange: false)
      //  .AddJsonFile(Path.Combine(context.ApplicationRootPath, $"appsettings.{context.EnvironmentName}.json"), optional: true, reloadOnChange: false);

    }
    public override void Configure(IFunctionsHostBuilder builder)
    {
      // get the configuration from the builder
      var configuration = builder.GetContext().Configuration;

      string basedir = AppDomain.CurrentDomain.BaseDirectory;

      Log.Logger = new LoggerConfiguration()
        .MinimumLevel.Information()
        .WriteTo.Console()
        .WriteTo.Debug()
        .WriteTo.File(basedir + "/logs/log-.txt", rollingInterval: RollingInterval.Day, rollOnFileSizeLimit: true)
        .CreateLogger();

      builder.Services.AddLogging(lb => { lb.AddSerilog(Log.Logger, true); });
    }
  }

  public class Function1
  {
    //other code
    private ILogger _log;

    public Function1(ILoggerFactory loggerFactory)
    {
      _log = loggerFactory.CreateLogger<Function1>();
    }
    
    [FunctionName("Function1")]
    public void Run([TimerTrigger("0 */1 * * * *")] TimerInfo myTimer, ILogger log)
    {
      _log.LogInformation($"C# Timer trigger function executed at: {DateTime.Now}");

      Log.Information("Hello World!");
    }
  }

I have reproduced in my local environment a example, You can use normal Timer Trigger function write logs into a file by following below workaround: Firstly create a Azure Function App with timer trigger then in host.json file add fileLoggingMode as below:

{
  "version": "2.0",
  "logging": {
    "fileLoggingMode": "always",
    "applicationInsights": {
      "samplingSettings": {
        "isEnabled": true,
        "excludedTypes": "Request"
      }
    }
  }
}

然后在 Function.cs 类中:

using System;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Host;
using Microsoft.Extensions.Logging;

namespace FunctionApp18
{
    public class Function1
    {
        [FunctionName("Function1")]
        public void Run([TimerTrigger("0 */1 * * * *")]TimerInfo myTimer, ILogger log)
        {
            log.LogInformation("Rithwik Here");
            log.LogInformation($"C# Timer trigger function executed at: {DateTime.Now}");
        }
    }
}

我在控制台中获取日志:

在此处输入图像描述

然后在我的本地路径中:

%temp%\LogFiles\Application\Functions.

我可以发现我的日志被写入如下文件:

在此处输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM