始终使用 Serilog 记录上下文数据

2024-01-08

我正在使用 Serilog 进行日志记录。对于每个日志,我想记录上下文信息,例如用户名和其他一些上下文信息。所以我用静态方法创建了包装器,如下所示

public static class MyLogger
{    
    public static void Error(Exception ex, string messageTemplate, params object[] propertyvalues)
    {
        var properties = new List<object>(propertyvalues);
        if (HttpContext.Current != null && HttpContext.Current.User != null && HttpContext.Current.User.Identity != null)
        {
            var contextInfo = new
            {                    
                UserName = HttpContext.Current.User.Identity.Name
            };
            messageTemplate += "{@ContextInfo}";
            properties.Add(contextInfo);
        }

        //serilog log
        Log.Error(ex, messageTemplate, properties.ToArray());
    }
}

然后将错误记录为

      MyLogger.Error(exception,"{@SomeMetadata}",metadata);

这是可行的,但是有没有更好的方法来包含 serilog 的上下文信息

Update1

所以我根据建议创建了一个丰富器

public class HttpContextEnricher: ILogEventEnricher
{
    LogEventProperty _cachedProperty;

    public const string EnvironmentUserNamePropertyName = "UserName";

    public void Enrich(LogEvent logEvent, ILogEventPropertyFactory propertyFactory)
    {
        _cachedProperty = _cachedProperty ?? propertyFactory.CreateProperty(EnvironmentUserNamePropertyName, GetUserName());
        logEvent.AddPropertyIfAbsent(_cachedProperty);
    }

    private string GetUserName()
    {
        if (HttpContext.Current != null && HttpContext.Current.User != null && HttpContext.Current.User.Identity != null)
        {
            return HttpContext.Current.User.Identity.Name;
        }

        return string.Empty;
    }
}

但是我如何调用它?哪个With我应该使用的方法?

  Log.Logger = new LoggerConfiguration()
            .Enrich.With???????
            .ReadFrom.AppSettings()
            .CreateLogger();

Update 2
我创建了扩展方法,然后在日志记录配置期间使用它

public static class HttpContextLoggerConfigurationExtensions
{
    public static LoggerConfiguration WithUserName(
        this LoggerEnrichmentConfiguration enrichmentConfiguration)
    {
        if (enrichmentConfiguration == null) throw new ArgumentNullException(nameof(enrichmentConfiguration));
        return enrichmentConfiguration.With<HttpContextEnricher>();
    }
}

然后在 Application_Start 事件中的 global.asax 中配置记录器

 Log.Logger = new LoggerConfiguration()
            .Enrich.WithUserName()
            .ReadFrom.AppSettings()
            .CreateLogger();

我注意到每次我记录一些内容时,enricher 都会被调用并返回 UserName,但它不会在日志中记录 UserName。我在日志中看到了我的消息,但没有看到 UserName 属性。我在用Windows 事件日志接收器 https://github.com/serilog/serilog-sinks-eventlog

我将信息记录为

       Log.Information("Some message");

和错误为

       Log.Error(exception, "ErrorID={ErrorID}",someid);

我缺少什么?


使用 Serilog 有几种不同的方法可以做到这一点。你可以使用Enricher https://github.com/serilog/serilog/wiki/Enrichment您在应用程序启动时配置的(当您配置日志记录时),它会在您记录消息时自动调用,并且您可以将所需的其他属性添加到日志上下文中。

另一种方法是在每个请求开始时挂钩由 Web 应用程序框架调用的事件,然后将属性添加到日志上下文。

另一种方法是在 DI 容器解析记录器实例时添加上下文属性(如果您正在使用容器)。


  • 丰富样品

https://github.com/serilog-web/owin/blob/master/src/SerilogWeb.Owin/Owin/RequestContextMiddleware.cs https://github.com/serilog-web/owin/blob/master/src/SerilogWeb.Owin/Owin/RequestContextMiddleware.cs

https://github.com/serilog-web/classic/blob/master/src/SerilogWeb.Classic/Classic/Enrichers/HttpRequestClientHostIPEnricher.cs https://github.com/serilog-web/classic/blob/master/src/SerilogWeb.Classic/Classic/Enrichers/HttpRequestClientHostIPEnricher.cs


  • 上下文推送属性示例

https://web.archive.org/web/20171207095449/http://mylifeforthecode.com/enriching-serilog-output-with-httpcontext-information-in-asp-net-core/ https://web.archive.org/web/20171207095449/http://mylifeforthecode.com/enriching-serilog-output-with-httpcontext-information-in-asp-net-core/


  • Autofac Serilog 集成

https://github.com/nblumhardt/autofac-serilog-integration https://github.com/nblumhardt/autofac-serilog-integration

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

始终使用 Serilog 记录上下文数据 的相关文章

  • 应用程序日志保存在哪里? [复制]

    这个问题在这里已经有答案了 可能的重复 Windows 上应用程序日志文件的存储位置 https stackoverflow com questions 1572934 where to store an application log f
  • 如何编写具有 cout 样式接口的记录器类 (logger << "Error: " << val << endl;)

    我想创建一个记录器类 具有如下功能 Logger log log lt lt Error lt lt value lt lt seen lt lt endl 这应该打印一条自定义格式的消息 例如 2009 年 9 月 12 日 11 22
  • 根记录器忽略记录器级别

    根记录器在 我认为 应该记录时不会记录 import logging NOTE I make sure to set the root logger level to logging DEBUG logging basicConfig fo
  • 在可序列化 Java 类中使用记录器的正确方法是什么?

    我有以下 doctored 我正在开发的系统中的类以及Findbugs http findbugs sourceforge net 正在生成一个SE BAD FIELD http findbugs sourceforge net bugDe
  • Sentry django 配置 - 记录器

    我正在尝试使用简单的日志记录并希望将错误 异常发送到 Sentry 我按照文档配置了 Sentry 并在我的开发人员上成功运行了测试 python manage py raven test 我添加了日志记录配置 如下所示哨兵文档 https
  • Python 记录器应该作为参数传递吗? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我们正在开发的 Python 应用程序需要一个记录器 一位同事认为应该在每个使用它的类中创建和配置记录器 我的观点是 它应该在应用程序启动时创建
  • 如何调试 Python 日志记录配置文件错误

    我已将 Python 的日志记录模块添加到我的代码中 以避免混乱的打印语句 但我却因配置错误而陷入困境 错误消息的信息不是很丰富 Traceback most recent call last File HDAudioSync py lin
  • Graylog2-如何将日志保留配置为 1 周

    我们正在使用一些 Graylog2 服务器 graylog server 版本 1 3 4 因为我们收到太多的日志消息 所以需要大量的内存 我正在尝试将日志保留时间减少到 1 周 所有超过 1 周的日志消息都将被删除 但是 我无法在配置文件
  • 如何使用Python的RotatingFileHandler

    我正在尝试进行测试运行logging模块的RotatingFileHandler https docs python org 3 library logging handlers html logging handlers Rotating
  • 在 Swift 中将进程标准输出重定向到 Apple 系统日志工具

    我正在为 macOS 构建一个启动子进程的 Swift 应用程序 该子进程将有用的信息记录到stdout 我在 Xcode 控制台中看到它 我现在想要实现的是重定向子流程stdout到Apple Log Facility 以便我们可以在部署
  • 命名 Python 记录器

    在 Django 中 我到处都有记录器 目前具有硬编码名称 对于模块级日志记录 即在视图函数的模块中 我有这样做的冲动 log logging getLogger name 对于类级别的日志记录 即在类中 init 方法 我有这样做的冲动
  • 如何从 os_log() 查找源文件和行号

    The 记录 Apple 参考 https developer apple com reference os 1891852 logging对于 iOS 10 和 macOS Sierra 中的新日志记录系统 明确表示不要包含行号和源文件信
  • 每个客户端和日期都有单独的日志文件和目录

    我有一个Windows TCP服务 有许多设备连接到它 并且客户端可以有一个或多个设备 要求 每个客户端都有单独的文件夹 每个设备都有单独的日志文件 所以像这样 MyService 25 04 2016 Client 1 Device1 t
  • 更改 Logger 实例的全局设置

    我在用着java util logging Logger http download oracle com javase 1 4 2 docs api java util logging Logger html作为我的应用程序的日志引擎 每
  • 从 pandas udf 记录

    我正在尝试从 python 转换中调用的 pandas udf 进行日志记录 因为在执行器上调用的代码不会显示在驱动程序的日志中 我一直在寻找一些选项 但到目前为止最接近的选项是这个one https stackoverflow com q
  • 通过 powershell 获取压缩的 TFS 2015 (vNext) 构建输出日志(就像构建后的下载链接一样)

    我想知道是否有人有一个 PowerShell 脚本 可以通过 TFS 2015 vNext 的 Rest API 下载此构建 ID 的所有当前构建日志 直到当前步骤 为每个记录的构建步骤创建单独的文本文件 并压缩所有文本文件 或者 如果已经
  • 您能让 Tomcat 6 stdout.log 文件表现得像 log4j DailyRollingFileAppender 吗?

    我们使用的是 Tomcat 6 的 Windows 安装 默认情况下 我们应用程序的 log4j 输出将转到 catalina base logs stdout log 文件 该日志文件仅在我们重新启动 Tomcat 时滚动 并且文件名始终
  • 从远程托管上的 PHP 获取 PHP 错误日志

    是否有 PHP 函数或其他方式以字符串形式获取 PHP 错误日志 我需要这个 因为我无法访问在其他人的服务器上运行的站点的错误日志 他提出通过电子邮件将错误日志发送给我 但这不太方便 有什么方法可以将错误日志输出到 PHP 页面吗 我意识到
  • PHP MVC 应用程序中哪里可以捕获异常?

    我有一个中小型 PHP 应用程序 用于练习 OOP 和 MVC 技能 我有初始化 引导程序调用的文件Router谁打电话控制器 gt 服务层 gt 存储库 数据库 然后将变量发送回视图层 所有依赖项均由 DiC IOC 处理 我创建抽象类
  • 为 Logstash 中的新字段设置 Elasticsearch Analyzer

    通过使用GROK filter 我们可以向Logstash添加新字段 但是 我想知道如何为该特定字段设置分析器 例如 我有一个新的 id 字段 其中有一个字段 例如a b 但是 Elasticsearch 附带的普通分析器会将其分解为a a

随机推荐

  • 雄辩有原始问题

    我有 2 个 SQL 表 一个代表旅行 另一个代表这些旅行的预订 结构如下 tours int id int max participants int state bookings int id fk tour fk date int nu
  • 如何完全卸载使用easy_install安装的pip?

    在 Windows 7 上 我使用 easy install 安装 pip 并且想要安装较低版本的 pip 我想删除旧版本 但不知道如何完全删除 easy install 安装的 pip 或者如果有一种方法可以在不通过 easy insta
  • 如何使用 Web API Get 方法返回图像

    我需要使用 Web API Get 方法返回图像 下面的代码似乎工作正常 除了我在 Fiddler 的 ImageView 窗口中收到此消息 此响应已编码 但不声称是图像 public HttpResponseMessage Get usi
  • Nginx“ssl_stapling”被忽略,在 OCSP 响应程序“ocsp.comodoca.com”中找不到主机

    我正在尝试在 Nginx 上设置 OCSP 装订 我收到错误 ssl stapling ignored host not found in OCSP responder ocsp comodoca com 这是文件 conf server
  • 如何在 JavaScript 中从 URL 获取 JSON?

    返回 JSON query count 1 created 2015 12 09T17 12 09Z lang en US diagnostics 我尝试了这个 但没有成功 responseObj readJsonFromUrl http
  • ViewModel 无法在 Activity 中实例化

    我正在尝试实例化一个 ViewModel 以在我的所有 Activity 中使用 public class LaunchActivity extends Activity private Controller control Overrid
  • Visual Studio 2017 Team Services:可以登录github帐户,但无法推送更改

    我一直在尝试通过 Visual Studio 2017 Team Services 在我的笔记本电脑上设置 github 它让我首先登录 甚至让我将存储库克隆 分叉到本地文件夹中 问题是每次我尝试推回 github 时都会出现以下错误 推送
  • 在 mysql 中使用 group by 仅选择最后一个值

    我有一张表 其中包含有关参加某些活动的数据 我在表中记录了用户每次发送新考勤时的考勤数据 信息如下 mysql gt SELECT id branch channel id member attendance timestamp id me
  • 如何从闪亮的 ggplotly 中获取数据行

    代码如下 我正在尝试使用plotly click事件来确定正在选择哪些数据 但是 我不知道该怎么做 plotly click 提供的数据非常少 根本不包括分组 我没有任何JS经验 但我知道一定有办法 我的目标是能够选择一个数据点并能够抓取它
  • 如何将 Scripting.FileSystemObject 标记为脚本安全?

    介绍 我正在为数控机床编程 确切地说是比雅斯的漫游者 用于编程的软件编辑器支持VBScript VBScript 用于实现条件语句和循环等 在软件说明中 我列出了 VBScript 中标记为不使用的所有语法 以避免复杂化 当然 我想使用 V
  • 在某些静态库中打开整个程序优化会大大增加库的大小!

    在 Visual Studio 2010 中 我有一个 C C 静态库项目 当我打开该选项时整个程序优化 in release模式下 我获得了超过 90 MB 的 lib 文件 当我关闭此选项时 大小会减少到 24 MB 该库包含数百个使用
  • 复制赋值运算符=自赋值检查错误

    如果我有一个类声明为 class Person public Person const int age constructor Person const Person other Person operator const Person o
  • 如何将 Excel 中的值限制在某个范围内?

    在 C 中我会使用boost clamp为了这 基本上我有一些excel函数 A1 B2 C3 D4 我想将其限制为 某个数字 称之为X1 显而易见的方法是这样的 MAX X1 MIN X1 A1 B2 C3 D4 但我希望能够做到这一点
  • Hive-Tez 上的 Map-Reduce 日志

    我想在 Hive Tez 上运行查询后获得 Map Reduce 日志的解释 INFO 后面的几行传达什么 这里我附上了一个样本 INFO Session is already open INFO Dag name SELECT a Mod
  • 使用 TPL 时如何在 UI 线程上调用方法?

    我正在开发一个 MVVM 应用程序 它使用 TPL 在后台执行多项任务 任务需要向 UI 报告进度 以便可以更新进度对话框 由于应用程序是 MVVM 因此进度对话框绑定到名为 Progress 的视图模型属性 该属性由具有签名的视图模型方法
  • JavaFX 拖放到 GridPane?

    我已经为我的游戏实现了拖放功能 但到目前为止我只能 拖放到 硬编码的位置 如图所示 我想要的是 当船舶被放下时 它的 x y 值 相对于 GridPane 被保存 或者 飞船掉落到的单元格被保存 我的 setOnDragDropped 事件
  • Jenkins gerrit 触发器在构建时未获取我的更改

    我已经使用 gerrit 触发器插件配置了 jenkins 以验证我们推送到 gerrit 的每个提交 我希望这个触发器包含我对原始存储库的最新更改并进行构建 但是 它仅克隆回购项目并进行编译 而无需我进行更改 以下是我在詹金斯中对 ger
  • 如何运行快照插件

    当我尝试使用以下命令运行下面的 Maven 插件时 com wordpress pomfromjarmavenplugin generate 0 0 1 SNAPSHOT generatepom 我收到此错误 下载中 https oss s
  • 如果数字以 1 结尾做某事

    我想做这样的事情 if day 1 day 11 day 21 day 31 day 41 result dan else result dana 我怎样才能对每个以 1 结尾的数字做到这一点 当然又不写出所有数字 只需检查除以 10 的余
  • 始终使用 Serilog 记录上下文数据

    我正在使用 Serilog 进行日志记录 对于每个日志 我想记录上下文信息 例如用户名和其他一些上下文信息 所以我用静态方法创建了包装器 如下所示 public static class MyLogger public static voi