簡體   English   中英

帶有彈性搜索目標的 Nlog ASP.Net Core 不起作用

[英]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"
  }
}

.Net Core 項目中的 Program.cs 文件如下所示

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();     

}

嘗試改變幾件事

  1. 添加文件目標以查看您的配置是否被 Nlog 識別。
  2. 將 Nlog.config 重命名為 nlog.config 並將文件屬性值標記為始終復制到輸出目錄。
  3. 確保您已將 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 需要是一個 2 步過程。

 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>
        

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM