未出现写入 ILogger 的 Serilog (Azure Functions V2)

2024-03-03

我已安装 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 实例中;


我遇到了完全相同的问题,但最终解决了。官方文档 https://learn.microsoft.com/en-us/azure/azure-functions/functions-dotnet-dependency-injection有一个提示:

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

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

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

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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

未出现写入 ILogger 的 Serilog (Azure Functions V2) 的相关文章

随机推荐

  • 模拟 GCC 语句表达式

    我被迫使用 IAR EW430 编译器 v7 12 进行嵌入式项目 并且它仅正式支持 c99 我希望能够通过除了编写一堆专用内联函数之外的任何方式以通用方式模拟 GCC 的语句表达式 有什么办法可以实现这一点吗 也许使用 MACRO wiz
  • 在 Jupyter Notebook 中的任意位置重命名变量

    有没有办法重命名当前 jupyter 笔记本文件中各处的变量 IE 假设我的笔记本通过我的脚本在多个函数和位置引用变量 foo 后来我决定将此变量重命名为 bar 以获得更好的可读性 在 Xcode 中 您可以突出显示并右键单击来执行此操作
  • 如何使用 Webdriver 和 C# 通过 Selenium 定位并单击嵌套在多个框架和框架集中的元素

    我有如下所示的 html 页面 我需要单击 clslogin 类中的 登录 如何遍历找到登录名 我正在使用 C 和 selenium Webdriver 使用 XPath html body div table tbody tr 1 td
  • 它如何获得比我想要的更多的内存?(C++)[重复]

    这个问题在这里已经有答案了 我想要一个1整数内存 但是这个程序如何工作呢 Code include
  • Passport-jwt 令牌过期

    我正在使用 Passport jwt 生成我的令牌 但我注意到令牌永远不会过期 有没有办法根据为我设置的规则使特定令牌失效 例如 use strict const passport require passport const passpo
  • 为python配置Vs code 2.0.0版本构建任务

    我需要帮助来配置我的 Vs 代码以使用 Cntrl Shift B 在 python 中运行脚本 我工作得很好 直到 Vs 代码升级到版本 2 0 0 现在它要求我配置构建 我不知道构建是什么 过去 当我只需要配置任务运行程序时 它效果很好
  • 计算圆交点 O( (n+s) log n)

    我试图弄清楚如何设计一种算法 可以以 O n s log n 复杂度完成此任务 s 是交叉点的数量 我尝试在互联网上搜索 但找不到真正的东西 无论如何 我意识到拥有良好的数据结构是关键 我在java中使用红黑树实现 TreeMap 我还使用
  • Solr 索引 My SQL 时间戳或日期时间字段

    要在 Solr 中索引日期 日期应采用 ISO 格式 我们可以在不修改 SQL Select 语句的情况下索引 MySQL Timestamp 或 Date Time 字段吗 我用过
  • 如何使用 Flask 和 sqlalchemy 进行选择查询?

    我是 Flask 和 SQLAlchemy 的新手 我在 postgress 有一个数据库 该数据库有表 数据 200 条记录 我想做一个 Select 语句 但当我这样做时总是给我同样的错误 这是我的代码 这是我的模型 py from s
  • DateTime.AddYears 在闰年的行为

    在 DateTime 上使用 AddYears 方法时 任何人都可以解释 NET 中闰年计算背后的数学或简单推理吗 如果您将 2012 年 2 月 29 日加上一年 您将得到 2013 年 2 月 28 日 而不是 2013 年 3 月 1
  • 如何在 Scala 中为泛型类型提供默认类型类?

    在 Scala 中 如果你创建一个类型类 比如代数结构Monoid T 您可以为不同类型的幺半群提供许多默认类型类实现 假设幺半群定义为 trait Monoid T def op x T y T T def id T Since Stri
  • 具有三个表的递归 CTE

    我正在使用 SQL Server 2008 R2 SP1 我想通过 沿着树向上走 来递归地找到某个组织单位的第一个非空经理 我有一张包含组织单位 ORG 的表 一张包含每个组织的父级的表 ORG 中的单位 我们将该表称为 ORG PAREN
  • 如何清除 firebase 云消息通知?

    我使用firebase云消息向手机发送消息 并且可以成功接收通知 但在某些情况下 我不会单击通知来打开我的应用程序 而是手动打开应用程序以进入前台 我想要的是当我打开应用程序时 通知栏中的通知应该自动清除 以下代码将清除您的应用程序的所有通
  • 有没有办法更新云功能中的collectionGroup

    我正在构建一个聊天应用程序 当用户对其本地配置文件进行更新时 我想使用云功能在整个集合组中进行更新 我成功侦听云函数中的更新并检索具有以下内容的 collectionGroups 列表 const collectionGroupNamere
  • swift 不允许函数参数初始化吗?

    第一个块生成一个通用的 Swift 编译错误 甚至不指向该行 let screenDivision size width 5 var game1 SKSpriteNode color redColor size CGSize width 2
  • Nativescript:在路由器出口之间导航

    更好的介绍请参见关于奥特莱斯的博客文章 https www nativescript org blog using nested router outlets with nativescript and angular 我使用 TabVie
  • 如何在 Swagger UI 中删除“示例”组合框或更改其文本?

    我的 Swagger UI 有一个问题 它显示一个空的 示例 组合框 下图中标记为黄色 看起来不太好 有没有办法删除它或将其文本更改为有用的内容 我尝试添加example标签 但它不起作用 操作定义如下所示 post tags pet su
  • azurepipelines-coverage.yml 的架构,用于为 PR 配置新发布的代码覆盖率指标功能

    该功能已描述here https learn microsoft com en us azure devops release notes 2019 sprint 155 update code coverage metrics and b
  • 如何删除数据库,错误5030数据库无法锁定

    我正在尝试删除 SQL Server 2005 中的现有数据库 我的第一次尝试产生了以下错误 5030 数据库不能独占 锁定以执行操作 此后我已经杀死了所有正在访问数据库的进程 我还删除了它之前涉及的复制订阅 除了 SQL Server 进
  • 未出现写入 ILogger 的 Serilog (Azure Functions V2)

    我已安装 Serilog 并配置为将日志事件数据写入 MS SQL Server for Azure Function 中的表 系统日志和静态类本身写入的日志显示在表中 但是当我尝试使用 Extensions Logging ILogger