gpt4 book ai didi

logging - 使用类名、方法名进行 Serilog 日志记录

转载 作者:行者123 更新时间:2023-12-02 16:43:43 28 4
gpt4 key购买 nike

我在我的项目 Angular、web api、EF 中使用 serilog 和 SEQ。我对两者都是新手。

1)如何确保每次写入错误、信息、调试时都应包含ClassName.Method Name。我知道我必须创建 Enrich 但不确定如何获取 ClassName.Method Name

例如

Class Test
{
public void testing(){
// logger.Error("Error ....");}
}

现在,当我看到日志时,它应该显示“29/09/2012 10:00:00, Test=>testing Error .....”

In,短日期时间,类名,方法名和消息

最佳答案

要在每次日志记录调用时自动获取方法名称,您必须使用反射(reflect)调用堆栈的丰富器(这样做的成本非常昂贵)来捕获方法名称。

这是 @nblumhardt 编写的示例: https://github.com/serilog/serilog/issues/1084#issuecomment-358117004

using System;
using System.Diagnostics;
using System.Linq;
using System.Runtime.CompilerServices;
using Serilog;
using Serilog.Configuration;
using Serilog.Core;
using Serilog.Events;

namespace ConsoleApp24
{
class CallerEnricher : ILogEventEnricher
{
public void Enrich(LogEvent logEvent, ILogEventPropertyFactory propertyFactory)
{
var skip = 3;
while (true)
{
var stack = new StackFrame(skip);
if (!stack.HasMethod())
{
logEvent.AddPropertyIfAbsent(new LogEventProperty("Caller", new ScalarValue("<unknown method>")));
return;
}

var method = stack.GetMethod();
if (method.DeclaringType.Assembly != typeof(Log).Assembly)
{
var caller = $"{method.DeclaringType.FullName}.{method.Name}({string.Join(", ", method.GetParameters().Select(pi => pi.ParameterType.FullName))})";
logEvent.AddPropertyIfAbsent(new LogEventProperty("Caller", new ScalarValue(caller)));
}

skip++;
}
}
}

static class LoggerCallerEnrichmentConfiguration
{
public static LoggerConfiguration WithCaller(this LoggerEnrichmentConfiguration enrichmentConfiguration)
{
return enrichmentConfiguration.With<CallerEnricher>();
}
}

class Program
{
static void Main(string[] args)
{
Log.Logger = new LoggerConfiguration()
.Enrich.WithCaller()
.WriteTo.Console(outputTemplate: "[{Timestamp:HH:mm:ss} {Level:u3}] {Message} (at {Caller}){NewLine}{Exception}")
.CreateLogger();

Log.Information("Hello, world!");

SayGoodbye();

Log.CloseAndFlush();
}

[MethodImpl(MethodImplOptions.NoInlining)]
static void SayGoodbye()
{
Log.Information("Goodbye!");
}
}
}
<小时/>

另一种选择(如果您只想在特定/更重要的地方捕获方法名称),是创建一个可以调用的扩展方法,该方法会将方法名称添加到日志记录上下文中...例如

Logger.Here().Information("Hello, world!");

您可以在 StackOverflow 上的另一个问题上查看如何在 Here 实现此方法的示例: https://stackoverflow.com/a/46905798

关于logging - 使用类名、方法名进行 Serilog 日志记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52473924/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com