1

我已安装 Serilog 并配置为将日志事件数据写入 MS SQL Server for Azure Function 中的表。

静态类本身写入的系统日志和日志出现在表中,但是当我尝试使用 Extensions.Logging.ILogger 时,即使我可以在 ILogger 中看到 Serilog 提供程序,消息也不会出现在表中。

Startup.cs 配置;

using Microsoft.ApplicationInsights.Extensibility;
using Microsoft.Azure.WebJobs.Hosting;
using Serilog;
using Serilog.Events;
using Serilog.Sinks.MSSqlServer;
using Microsoft.Azure.WebJobs;

[assembly: FunctionsStartup(typeof(Rubix.FunctionApp.Startup))]
namespace Rubix.FunctionApp
{
    public class Startup : IWebJobsStartup
    {

        public Startup()
        {
            var config = new ConfigurationBuilder()
               .AddJsonFile("local.settings.json", optional: true, reloadOnChange: true)
               .AddEnvironmentVariables()
               .Build();

            var logDbConnectionString = "connectionString";
            var logTable = "LogEntry";
            var columnOptions = new ColumnOptions()
            {
                AdditionalColumns = new Collection<SqlColumn>
                {
                    new SqlColumn
                        {ColumnName = "Filter", DataType = SqlDbType.NVarChar, DataLength = 50},

                    new SqlColumn
                        {ColumnName = "JsonType", DataType = SqlDbType.NVarChar, DataLength = 50},
                }
            };
            // we don't need XML data
            columnOptions.Store.Remove(StandardColumn.Properties);
            // we do want JSON data
            columnOptions.Store.Add(StandardColumn.LogEvent);
            // exclude standard columns from the json output
            columnOptions.LogEvent.ExcludeStandardColumns = true;

            Log.Logger = new LoggerConfiguration()
                .ReadFrom.Configuration(config)
                .Enrich.FromLogContext()
                .WriteTo.MSSqlServer(
                    connectionString: logDbConnectionString,
                    tableName: logTable,
                    columnOptions: columnOptions
                )
                .WriteTo.ApplicationInsights(TelemetryConfiguration.Active, TelemetryConverter.Traces, LogEventLevel.Information)
                .CreateLogger();
        }



        public void Configure(IWebJobsBuilder builder)
        {
            ConfigureServices(builder.Services).BuildServiceProvider(true);
        }

        private IServiceCollection ConfigureServices(IServiceCollection services)
        {
             services
                .AddLogging(loggingBuilder =>
                    loggingBuilder.AddSerilog(dispose: true)
                );

            return services;
        }

    }
}

在 Azure Function 中创建 ILogger;

public class Function
    {
        private readonly ILogger<Function> _logger;      

        public Function(ILoggerFactory loggerFactory)
        {
            _logger = loggerFactory.CreateLogger<Function>();
        }

        [FunctionName("Function1")]
        public async Task Run([ServiceBusTrigger("topic-name", "subscription-name", Connection = "AzureServiceBus")]string message)
        {
            Log.Logger.Information("Function invoked");// ---->  WORKING!

            _logger.LogInformation("Function invoked by ILogger");// ----> NOT WORKING!

        }


    } 

此外,将 ILogger 本身接收到 cons 中也不起作用..

奇怪的是只有系统日志被记录到表中;

在此处输入图像描述

并且 Serilog 提供程序已经存在于不工作的 ILogger 实例中;

在此处输入图像描述

4

3 回答 3

2

我有完全相同的问题,但最终解决了。官方文档有提示:

启动类仅用于设置和注册。避免在启动过程中使用启动时注册的服务。例如,不要尝试在启动期间注册的记录器中记录消息。注册过程的这一点对于您的服务可用还为时过早。运行 Configure 方法后,Functions 运行时会继续注册其他依赖项,这可能会影响服务的运行方式。

因此,当您调用以下代码时,此记录器仅在被主机内部配置覆盖之前使用。

services.AddLogging(loggingBuilder =>
    loggingBuilder.AddSerilog(dispose: true)
);

您需要将 Serilog 注册为记录器提供程序。这将把它作为提供者之一包含在以下配置中。

builder.Services
    .AddSingleton<ILoggerProvider>(new Serilog.Extensions.Logging.SerilogLoggerProvider(Log.Logger));

根据我的经验,本地 azure 函数模拟器中的行为是不同的,因此请尝试使用已部署的实例。

于 2021-04-23T07:01:02.807 回答
0

我认为你的问题是如果过滤掉你的日志并且只将系统日志发布到serilog,那么函数运行时。将您的host.json配置更改为以下内容,以允许所有日志在 Trace 及以上级别通过:

{
  "version": "2.0",
  "logging": {
    "fileLoggingMode": "debugOnly",
    "logLevel": {
      // For all functions. Can also specify function name
      "Function": "Trace",
      // Default settings, e.g. for host
      "default": "Trace"
    }
  }
}

更多文档位于https://docs.microsoft.com/en-us/azure/azure-functions/functions-host-json

于 2019-11-15T16:46:59.707 回答
0

我想你想要的是Fatal日志,因为我Criticalserilog wiki 日志级别中找不到级别。并且描述Fatal是导致应用程序完全失败的严重错误。

下面是我的Serilog.Sinks.MSSqlServer包代码测试,效果很好。这是有关此包的详细信息:Serilog.Sinks.MSSqlServer

        var logDB = "Server=xxxxxxx";
        var logTable = "Logs";
        var options = new ColumnOptions();
        options.Store.Remove(StandardColumn.Properties);
        options.Store.Add(StandardColumn.LogEvent);


        var log = new LoggerConfiguration()
            .WriteTo.MSSqlServer(
                connectionString: logDB,
                tableName: logTable,
                autoCreateSqlTable:true,
                restrictedToMinimumLevel:Serilog.Events.LogEventLevel.Verbose,
                columnOptions: options
            ).CreateLogger();

        log.Information("C# HTTP trigger function processed a request.");
        log.Fatal("Here is a fatal log meesage");
        log.Warning("Here is a warning log message");
        log.Error("Here is an error log message");

在此处输入图像描述

于 2019-08-05T09:27:04.180 回答