C# NetCore库项目中的Nlog日志IP地址
我有一个包含多个项目的VS 2017解决方案,我有一个单独的项目,使用NLog方法将其与其他项目分开使用,因为不包括所有项目中的NLog NetCore Rest API NetCore基础结构 NetCore数据库与持久性 NetCore记录器 具有帮助程序和ViewModel类的其他NetStandard项目 我想记录客户端IP地址和用户(如果已登录)。我已经看到我必须在NLog.config中使用模板,但它不起作用,并且log IPAddress字段为空 正确的方法是什么 NLog.ConfigC# NetCore库项目中的Nlog日志IP地址,c#,asp.net-core-2.0,nlog,asp.net-core-webapi,httpcontent,C#,Asp.net Core 2.0,Nlog,Asp.net Core Webapi,Httpcontent,我有一个包含多个项目的VS 2017解决方案,我有一个单独的项目,使用NLog方法将其与其他项目分开使用,因为不包括所有项目中的NLog NetCore Rest API NetCore基础结构 NetCore数据库与持久性 NetCore记录器 具有帮助程序和ViewModel类的其他NetStandard项目 我想记录客户端IP地址和用户(如果已登录)。我已经看到我必须在NLog.config中使用模板,但它不起作用,并且log IPAddress字段为空 正确的方法是什么 NLog.Con
<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>
我使用了NLog日志,我可以在日志上看到此消息
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 IWebHostBuilder上的UseNLog将注册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();
另请参见您是否正在使用UseNLog?请检查内部日志:@Julian我已经在我的问题中添加了NLog日志您的NLog设置如何?e、 g.program.cs-看到了吗,我必须在Startup.cs上这样做,即使我在单独的项目上有NLog类,正如我所说的那样?我可以对此进行修改,并继续使用单独项目上的Logger类?对于ASP.NET Core,您需要将NLog挂接到ASP.NET Core管道中。因此,每个ASP.NET核心项目都需要它,但类库不需要。当然,您可以创建帮助程序来防止代码重复非常感谢您提供的解决方案。它对我有用。
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();