- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在实现一个自定义的 Microsoft.Extensions.Logging.ILogger (和 ILoggerProvider。我想检索当前的身份,但我真的不知道,因为我无法注入(inject)任何东西,而且我也不知道当前的 HttpContext。
我的方法可能是错误的......这种要求有典型的解决方案吗?
这里有几行代码:
factory.AddProvider(new MongoDBLoggerProvider(connectionString, database));
public ILogger CreateLogger(string categoryName)
{
var client = new MongoClient(_connectionString);
var database = client.GetDatabase(_database);
return new MongoDBLogger(database, categoryName);
}
public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func<TState, Exception, string> formatter)
{
var now = DateTime.Now;
var entry = new LogEntry
{
Date = now,
UserId = ?????
Exception = exception,
Level = logLevel,
State = state.ToString(),
Scope = _categoryName,
EventId = eventId.Id,
EventName = eventId.Name,
FormattedState = formatter != null ? formatter(state, exception) : null
};
PushAndForget(entry, _database);
}
最佳答案
这是一个可以访问身份的工作自定义记录器的示例。它应该完成您正在寻找的内容,我刚刚在示例中重命名了一些类以提高可读性。在您设计客户记录器时,这篇 Microsoft 文章也可能是一个有用的资源https://docs.microsoft.com/en-us/aspnet/core/fundamentals/logging/?view=aspnetcore-3.1#create-a-custom-logger
您可以根据需要设置配置值:
public class LoggingServiceConfig
{
public LogLevel LogLevel { get; set; } = LogLevel.Information;
public int EventId { get; set; } = 0;
public ConsoleColor Color { get; set; } = ConsoleColor.Yellow;
}
Config 类有以下用途:
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
设置自定义记录器:
public class LoggingService : ILogger
{
private readonly ILogStore _logStore;
private readonly Microsoft.AspNetCore.Http.IHttpContextAccessor _httpContextAccessor;
private readonly LoggingServiceConfig _config;
public LoggingService(string categoryName, LoggingServiceConfig config,
Microsoft.AspNetCore.Http.IHttpContextAccessor httpContextAccessor,
ILogStore logStore)
{
_config = config;
_logStore = logStore;
_httpContextAccessor = httpContextAccessor;
}
public IDisposable BeginScope<TState>(TState state)
{
return null;
}
public bool IsEnabled(LogLevel logLevel)
{
return true; //currently log everything regardless of logLevel
}
public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func<TState, Exception, string> formatter)
{
LogEntry log = new LogEntry(); //this is your log entry
if (_httpContextAccessor.HttpContext != null)
{
var userManager = _httpContextAccessor.HttpContext.RequestServices.GetService<UserManager<AspNetUser>>(); //this is the user manager you can use to perform identity functions, you can likewise request the signInManager service as well if needed
var user = userManager.GetUserAsync(_httpContextAccessor.HttpContext.User);
if (user != null && user.Result != null)
{
//do something with user.Result as this is your identity user record
log.UserId = user.Result.UserId;
log.Username = user.Result.UserName;
}
}
if (exception != null)
{
log.ErrorMessage = exception.Message;
}
var signInManager = _httpContextAccessor.HttpContext.RequestServices.GetService<SignInManager<AspNetUser>>(); //I accessed the sign in manager in case you need it to conditionally affect how you write create your LogEntry
//add other properties you want to the log here
_logStore.Add(log); //this is where you can call your PushAndForget or any method to write to database assumed you injected it correctly or the like, you can reference the .net core respository pattern for further details on how i did my _logStore
}
}
自定义记录器有以下用途:
using Microsoft.AspNetCore.Identity;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.Extensions.DependencyInjection;
设置日志记录提供程序:
public class LoggingServiceLoggerProvider : ILoggerProvider
{
private readonly LoggingServiceConfig _config;
private readonly ConcurrentDictionary<string, LoggingService> _loggers = new ConcurrentDictionary<string, LoggingService>();
private readonly ILogStore _logStore;
private readonly Microsoft.AspNetCore.Http.IHttpContextAccessor _httpContextAccessor;
public LoggingServiceLoggerProvider(LoggingServiceConfig config,
Microsoft.AspNetCore.Http.IHttpContextAccessor httpContextAccessor,
ILogStore logStore)
{
_config = config;
_httpContextAccessor = httpContextAccessor;
_logStore = logStore; //this is a repository for storing logs
}
public ILogger CreateLogger(string categoryName)
{
return _loggers.GetOrAdd(categoryName, name => new LoggingService(name, _config,
_httpContextAccessor,
_logStore));
}
public void Dispose()
{
_loggers.Clear();
}
}
自定义日志记录提供程序具有以下 using 语句:
using Microsoft.AspNetCore.Identity;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
在您的 Startup.cs 中确保配置方法具有 ILoggerFactory loggerFactory 参数并包括以下内容:
loggerFactory.AddProvider(new LoggingServiceLoggerProvider(
new LoggingServiceConfig
{
LogLevel = LogLevel.Error,
Color = ConsoleColor.Red
},
new Microsoft.AspNetCore.Http.HttpContextAccessor(),
new LogStore()));
关于c# - 在 ILogger 自定义实现中检索身份,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39367044/
我正在使用SQL Server 2008 R2,并且想创建一个触发器。 对于每个添加(仅添加),将像这样更新一列: ABC-CurrentYear-AutoIncrementCode 例子: ABC-
是否可以在显示最终一致性的数据存储中创建/存储用户帐户? 似乎不可能在没有一堆架构复杂性的情况下管理帐户创建,以避免可能发生具有相同 UID(例如电子邮件地址)的两个帐户的情况? 最终一致性存储的用户
您好, 我有一个带有 Identity 的 .NetCore MVC APP并使用 this指导我能够创建自定义用户验证器。 public class UserDomainValidator : IU
这与以下问题相同:HiLo or identity? 我们以本站的数据库为例。 假设该站点具有以下表格: 帖子。 投票。 注释。 使用它的最佳策略是什么: 身份 - 这是更常见的。 或者 HiLo -
我想将 Blazor Server 与 ASP.NET Identity 一起使用。但我需要使用 PostgreSQL 作为用户/角色存储,因为它在 AWS 中。 它不使用 EF,这是我需要的。 我创
我正在开发一个 .NET 应用程序,它可以使用 Graph API 代表用户发送电子邮件。 提示用户对应用程序进行授权;然后使用获取的访问 token 来调用 Graph API。刷新 token 用
我使用 ASP.NET 身份和 ClaimsIdentity 来验证我的用户。当用户通过身份验证时,属性 User.Identity 包含一个 ClaimsIdentity 实例。 但是,在登录请求期
所以我在两台机器上都安装了 CYGWIN。 如果我这样做,它会起作用: ssh -i desktop_rsa root@remoteserver 这需要我输入密码 ssh root@remoteser
我尝试在 mac osx 上的终端中通过 telnet 连接到 TOR 并请求新身份,但它不起作用,我总是收到此错误消息: Trying 127.0.0.1... telnet: connect to
我正在开发一个 .NET 应用程序,它可以使用 Graph API 代表用户发送电子邮件。 提示用户对应用程序进行授权;然后使用获取的访问 token 来调用 Graph API。刷新 token 用
我正在开发一项服务,客户可以在其中注册他们的 webhook URL,我将发送有关已注册 URL 的更新。为了安全起见,我想让客户端(接收方)识别是我(服务器)向他们发送请求。 Facebook和 G
在 Haskell 中,有没有办法测试两个 IORef 是否相同?我正在寻找这样的东西: IORef a -> IORef a -> IO Bool 例如,如果您想可视化由 IORef 组成的图形,这
我是 .NET、MVC 和身份框架的新手。我注意到身份框架允许通过注释保护单个 Controller 操作。 [Authorize] public ActionResult Edit(int? Id)
我有一列具有身份的列,其计数为19546542,我想在删除所有数据后将其重置。我需要类似ms sql中的'dbcc checkident'这样的内容,但在Oracle中 最佳答案 在Oracle 12
这是我用来创建 session 以发送电子邮件的代码: props.put("mail.smtp.auth", "true"); props.put("mail.smtp.starttls.enabl
我想了解 [AllowAnonymous] 标签的工作原理。 我有以下方法 [HttpGet] public ActionResult Add() { return View(); } 当我没
在使用沙盒测试环境时,PayPal 身份 token 对某些人显示而不对其他人显示的原因是否有任何原因。 我在英国使用 API,终生无法生成或找到 token 。 我已经遵循协议(protocol)并
我对非常简单的事情有一些疑问:IDENTITY。我尝试在 phpMyAdmin 中创建表: CREATE TABLE IF NOT EXISTS typEventu ( typEventu
习语 #1 和 #5 是 FinnAPL Idiom Library两者具有相同的名称:“Progressive index of (without replacement)”: ((⍴X)⍴⍋⍋X⍳
当我第一次在 TFS 中设置时,我的公司拼错了我的用户名。此后他们将其更改为正确的拼写,但该更改显然未反射(reflect)在 TFS 中。当我尝试 checkin 更改时,出现此错误: 有没有一种方
我是一名优秀的程序员,十分优秀!