Я работаю над решением . net core 3.1 .
Структура:
-Solution
-- Api (webapi)
-- Common (class lib)
-- Repository (class lib)
-- Service (class lib)
Служба ведения журнала настроена в общем проекте, а общий проект является ссылкой для других трех проектов.
Когда Api получает вызов, я хочу установить sh идентификатор для вызова, а затем включить этот идентификатор в каждый журнал, который создается для этого вызова. Идея заключается в том, что когда я просматриваю логи, я могу легко отфильтровать их, чтобы увидеть все действия для одного вызова.
Это работает в 2.2, хотя это выглядит как хак, (см. код ниже) . Я ищу чистый путь к t ie всем моим журналам для одного звонка вместе, используя. net core 3.1. Другие решения приветствуются.
In. net core 2.2 Я использовал фильтр действий для установки переменной сеанса
LogProperties class
public static string TraceId
{
get
{
return LQogProperties.httpContextAccessor.HttpContext.Session.GetString(LogProperties.TRACEID);
}
set
{
var bytes = Encoding.UTF8.GetBytes(value);
LogProperties.httpContextAccessor.HttpContext.Session.Set(LogProperties.TRACEID, bytes);
}
}
public static void Configure(IHttpContextAccessor httpContextAccessor)
{
LogProperties.httpContextAccessor = httpContextAccessor;
}
public static void GetTraceId()
{
LogProperties.TraceId = Guid.NewGuid().ToString().Substring(0, 8).ToUpper();
}
TraceFilter: IActionFilter
public void OnActionExecuting(ActionExecutingContext context)
{
LogProperties.GetTraceId();
}
Startup.ConfigureServices
...
// Setup trace id
services.AddMvc(config => { config.Filters.Add(new TraceIdFilter()); });
services.AddSession();
services.AddHttpContextAccessor();
...
Startup.Configure
...
app.UseSession();
LogProperties.Configure(app.ApplicationServices.GetRequiredService<IHttpContextAccessor>());
...