c# - 来自 NetCore 库项目的 Nlog 日志 IP 地址
问题描述
我有一个包含多个项目的 VS 2017 解决方案,我有一个带有 NLog 方法的单独项目,可以从其他项目中使用它,而不是在所有项目中包含 NLog。
- NetCore 休息 API
- NetCore 基础设施
- NetCore 数据库和持久化
- NetCore 记录器
- 其他带有助手和 ViewModel 类的 NetStandard 项目
如果已登录,我想记录客户端 IP 地址和用户。我已经看到我必须在 NLog.config 中使用模板,但它不起作用并且日志 IPAddress 字段为空。
正确的方法是什么?
NLog.Config
<extensions>
<add assembly="NLog.Web.AspNetCore"/>
</extensions>
<targets>
<target name="Database" xsi:type="Database">
<commandText>
INSERT INTO T_LOG
(DATE_, APP, IPADDRESS, USER_, CENTRE, LEVEL_, LOGGER,
METHOD, MESSAGE, EXCEPTION,
SOURCE_FILE_PATH, LINE_NUMBER)
VALUES(
@Date, @App, @IPAddr, @User, @Centre, @Level, @Logger,
@Method, @Message, @Exception,
@SourceFilePath, @LineNumber);
</commandText>
<parameter name="@App" layout="${AppName}" />
<parameter name="@IPAddr" layout="${aspnet-request-ip}" />
<parameter name="@User" layout="" />
<parameter name="@Centre" layout="" />
<parameter name="@Date" layout="${longdate}" />
<parameter name="@Level" layout="${level:upperCase=true}"/>
<parameter name="@Logger" layout="${logger:shortName=false}"/>
<parameter name="@Method" layout="${event-context:item=callermember}"/>
<parameter name="@Message" layout="${message}" />
<parameter name="@Exception" layout="${exception:format=ToString}"/>
<parameter name="@SourceFilePath" layout="${event-context:item=callerpath}" />
<parameter name="@LineNumber" layout="${event-context:item=callerline}" />
</target>
记录器类
using Microsoft.AspNetCore.Http;
using NLog;
using System;
using System.Runtime.CompilerServices;
namespace Project.Log
{
public class CustomLogger
{
private readonly Logger logger;
private Type type;
public RhesusLog(Type type)
{
this.type = type;
this.logger = LogManager.GetLogger(type.FullName);
}
public void Debug(string msg, Exception ex = null,
[CallerFilePath] string CallerPath = "",
[CallerMemberName] string CallerMember = "",
[CallerLineNumber] int CallerLine = 0, params object[] args)
{
this.Log(LogLevel.Debug, msg, ex, CallerPath, CallerMember, CallerLine);
}
public void Info(string msg, Exception ex = null,
[CallerFilePath] string CallerPath = "",
[CallerMemberName] string CallerMember = "",
[CallerLineNumber] int CallerLine = 0)
{
this.Log(LogLevel.Info, msg, ex, CallerPath, CallerMember, CallerLine);
}
// Other Levels logs ....
private void Log(LogLevel Level, string msg,
Exception Exception = null, string CallerPath = "",
string CallerMember = "", int CallerLine = 0, params object[] parameters)
{
LogEventInfo LogEvent = new LogEventInfo(Level, this.type.FullName, msg);
LogEvent.Parameters = parameters;
LogEvent.Exception = Exception;
LogEvent.Properties.Add("callerpath", CallerPath);
LogEvent.Properties.Add("callermember", CallerMember);
LogEvent.Properties.Add("callerline", CallerLine);
this.logger.Log(LogEvent);
}
}
}
我使用过 NLog Log,我可以在 Log 上看到这条消息
2018-09-06 23:31:44.6183 Debug Setting 'DatabaseParameterInfo.layout' to '${aspnet-request-ip}'
2018-09-06 23:31:44.6183 Debug Missing serviceProvider, so no HttpContext
解决方案
如果 NLog 记录“缺少 serviceProvider,所以没有 HttpContext”,则 serviceProvider 没有正确注册到 NLog。
UseNLog()
on将IWebHostBuilder
注册ServiceProvider
并添加HttpContextAccessor
到 DI 系统。
因此,您应该仔细检查您是否在正确的时间调用 UseNLog(),请参见以下 program.cs 示例:
public static void Main(string[] args)
{
// NLog: setup the logger first to catch all errors
var logger = NLog.Web.NLogBuilder.ConfigureNLog("nlog.config").GetCurrentClassLogger();
try
{
logger.Debug("init main");
BuildWebHost(args).Run();
}
catch (Exception ex)
{
//NLog: catch setup errors
logger.Error(ex, "Stopped program because of exception");
throw;
}
finally
{
// Ensure to flush and stop internal timers/threads before application-exit (Avoid segmentation fault on Linux)
NLog.LogManager.Shutdown();
}
}
public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.ConfigureLogging(logging =>
{
logging.ClearProviders();
logging.SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Trace);
})
.UseNLog() // NLog: setup NLog for Dependency injection
.Build();
另请参阅https://github.com/NLog/NLog.Web/wiki/Getting-started-with-ASP.NET-Core-2
推荐阅读
- sharepoint - Connect-PnPOnline 提示登录浏览器而不是使用凭据
- java - 如何检查使用@SessionAttributes 创建的会话是否存在(Spring MVC)
- java - 当我们使用 getBean 方法创建原型 bean 时,是否会创建新的 bean 属性实例(单例)?
- hive - 当您使用 insert into 命令时,Hive 是否会创建新数据?
- android - 将数据从片段传递到活动是不同的
- java - 创建 Junit 测试用例后,“Run as Junit Test”消失
- search - 模糊搜索后视图的 XPages 排序
- vba - 将 VBA 转换为 vb.net
- android - 为什么 dex 文件对于 android 项目的不同 buildvariants 不同
- python - 如何提取数据集中一分钟的每个数据点?