Nlog ASP.Net 核心与弹性搜索目标不工作
Nlog ASP.Net Core with Elastic search target not working
NLog.Config弹性搜索目标:
<target name="elasticWrapper" xsi:type="BufferingWrapper" flushTimeout="5000">
<target xsi:type="ElasticSearch"
name="elastic"
connectionStringName="ElasticUrl"
index="logs-${date:format=yyyy.MM.dd}"
documentType="logevent"
includeAllProperties="true"
layout="${message}">
</target>
</target>
弹性搜索目标的 connectionstringname 属性用于从 appsettings.json
获取信息
appsettings.json如下图
{
"Logging": {
"IncludeScopes": false,
"LogLevel": {
"Default": "Debug",
"System": "Information",
"Microsoft": "Information"
}
},
"ConnectionStrings": {
"ElasticUrl": "http://XXXXXX-XXXXXX:9200"
}
}
Program.cs 来自 .Net Core 项目的文件,如下所示
public static void Main(string[] args)
{
var config = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.Build();
NLogBuilder.ConfigureNLog("nLog.config");
foreach (var setting in config.GetChildren().ToDictionary(x => x.Key, x => x.Value))
{
LogManager.Configuration.Variables[setting.Key] = setting.Value;
}
var logger = LogManager.GetCurrentClassLogger();
var host = WebHost.CreateDefaultBuilder(args)
.UseContentRoot(Directory.GetCurrentDirectory())
.UseNLog()
.Build();
host.Run();
}
尝试改变一些东西
- 添加文件目标以查看您的配置是否被 Nlog 识别。
- 将 Nlog.config 重命名为 nlog.config 并将文件属性值标记为始终复制到输出目录。
- 确保您已将 NLog.Targets.ElasticSearch nuget 包添加到您的项目中。
我个人在容器内使用我的应用程序。所以我将整个设置移动到代码中,并使用非常适合我的环境变量设置它们的值。
如果您的问题仍然存在,请告诉我。我将提供代码以通过代码配置nlog。
我已经设法让它以编程方式工作。
public static void Main(string[] args)
{
var config = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.Build();
var logFactory = LogManager.LoadConfiguration("nLog.config");
foreach (var setting in config.GetChildren().ToDictionary(x => x.Key, x => x.Value))
{
logFactory.Configuration.Variables[setting.Key] = setting.Value;
}
var target = logFactory.Configuration.FindTargetByName("elastic") as ElasticSearchTarget;
target.Uri = config.GetConnectionString("ElasticUrl");
NLogBuilder.ConfigureNLog("nLog.config");
var logger = LogManager.GetCurrentClassLogger();
var host = WebHost.CreateDefaultBuilder(args)
.UseContentRoot(Directory.GetCurrentDirectory())
.UseNLog()
.Build();
host.Run();
}
扩展@Sahadevan 的回答。
如果您使用 BufferingWrapper,则 findTargetByName 需要分两步进行。
var target = logFactory.Configuration.FindTargetByName("elastic") as BufferingTargetWrapper;
var esTarget = target.WrappedTarget as ElasticSearchTarget;
示例配置:
<target xsi:type="BufferingWrapper" name="elastic"
flushTimeout="5000">
<target xsi:type="ElasticSearch"
includeAllProperties ="true">
</target>
</target>
NLog.Config弹性搜索目标:
<target name="elasticWrapper" xsi:type="BufferingWrapper" flushTimeout="5000">
<target xsi:type="ElasticSearch"
name="elastic"
connectionStringName="ElasticUrl"
index="logs-${date:format=yyyy.MM.dd}"
documentType="logevent"
includeAllProperties="true"
layout="${message}">
</target>
</target>
弹性搜索目标的 connectionstringname 属性用于从 appsettings.json
获取信息appsettings.json如下图
{
"Logging": {
"IncludeScopes": false,
"LogLevel": {
"Default": "Debug",
"System": "Information",
"Microsoft": "Information"
}
},
"ConnectionStrings": {
"ElasticUrl": "http://XXXXXX-XXXXXX:9200"
}
}
Program.cs 来自 .Net Core 项目的文件,如下所示
public static void Main(string[] args)
{
var config = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.Build();
NLogBuilder.ConfigureNLog("nLog.config");
foreach (var setting in config.GetChildren().ToDictionary(x => x.Key, x => x.Value))
{
LogManager.Configuration.Variables[setting.Key] = setting.Value;
}
var logger = LogManager.GetCurrentClassLogger();
var host = WebHost.CreateDefaultBuilder(args)
.UseContentRoot(Directory.GetCurrentDirectory())
.UseNLog()
.Build();
host.Run();
}
尝试改变一些东西
- 添加文件目标以查看您的配置是否被 Nlog 识别。
- 将 Nlog.config 重命名为 nlog.config 并将文件属性值标记为始终复制到输出目录。
- 确保您已将 NLog.Targets.ElasticSearch nuget 包添加到您的项目中。
我个人在容器内使用我的应用程序。所以我将整个设置移动到代码中,并使用非常适合我的环境变量设置它们的值。
如果您的问题仍然存在,请告诉我。我将提供代码以通过代码配置nlog。
我已经设法让它以编程方式工作。
public static void Main(string[] args)
{
var config = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.Build();
var logFactory = LogManager.LoadConfiguration("nLog.config");
foreach (var setting in config.GetChildren().ToDictionary(x => x.Key, x => x.Value))
{
logFactory.Configuration.Variables[setting.Key] = setting.Value;
}
var target = logFactory.Configuration.FindTargetByName("elastic") as ElasticSearchTarget;
target.Uri = config.GetConnectionString("ElasticUrl");
NLogBuilder.ConfigureNLog("nLog.config");
var logger = LogManager.GetCurrentClassLogger();
var host = WebHost.CreateDefaultBuilder(args)
.UseContentRoot(Directory.GetCurrentDirectory())
.UseNLog()
.Build();
host.Run();
}
扩展@Sahadevan 的回答。
如果您使用 BufferingWrapper,则 findTargetByName 需要分两步进行。
var target = logFactory.Configuration.FindTargetByName("elastic") as BufferingTargetWrapper;
var esTarget = target.WrappedTarget as ElasticSearchTarget;
示例配置:
<target xsi:type="BufferingWrapper" name="elastic"
flushTimeout="5000">
<target xsi:type="ElasticSearch"
includeAllProperties ="true">
</target>
</target>