web-dev-qa-db-fra.com

Comment se connecter de .NET Core Web API à Elasticsearch sur son propre index

J'ai une API Web .NET écrite avec C # et un Elasticsearch . Sur Elasticsearch, j'ai un index " logging " où je veux pousser mes journaux de l'API vers.

Je ne peux pas comprendre comment obtenir mes journaux de l'API C # dans la "journalisation" élastique. J'ai lu des documentations comme Logging with ElasticSearch ... , mais je n'ai pas de journal de bord disponible sur mon Elasticsearch. Je recherche donc un package qui facilite ma connexion de manière simple. Je pense qu'il faut remettre les index "logging", pour qu'il sache où se connecter.

Quelqu'un peut-il recommander une documentation et/ou un package pour cela?

Ou dois-je le programmer moi-même?

7
Frank Mehlhop

Il existe désormais également un fournisseur d'enregistreurs autonome qui écrira la journalisation .NET Core directement dans Elasticsearch, conformément aux spécifications de champ Elasticsearch Common Schema (ECS), https://github.com/sgryphon/essential-logging/tree /master/src/Essential.LoggerProvider.Elasticsearch

Avertissement: je suis l'auteur.

Ajoutez une référence au package Essential.LoggerProvider.Elasticsearch:

dotnet add package Essential.LoggerProvider.Elasticsearch

Ensuite, ajoutez le fournisseur au loggingBuilder pendant la construction de l'hôte, à l'aide de la méthode d'extension fournie.

using Essential.LoggerProvider;

// ...

    .ConfigureLogging((hostContext, loggingBuilder) =>
    {
        loggingBuilder.AddElasticsearch();
    })

Vous pouvez ensuite injecter ILogger dans vos contrôleurs, etc., et y écrire en utilisant la journalisation .NET habituelle, y compris les étendues et les valeurs sémantiques (pour une introduction générale à la journalisation, voir https://docs.Microsoft.com/ en-us/aspnet/core/fundamentals/logging / ):

using (_logger.BeginScope("{CustomerId}", customerId))
{
  _logger.LogWarning("End of processing reached at {EndTime}.", end);
}

La configuration par défaut écrit dans une Elasticsearch locale exécutée à http: // localhost: 9200 / .

Il existe un exemple de projet qui inclut un fichier de composition de docker pour configurer une instance locale d'Elasticsearch et de Kibana si vous en avez besoin, https://github.com/sgryphon/essential-logging/tree/master/examples/HelloElasticsearch

L'exemple de projet montre également les meilleures pratiques pour la journalisation haute performance, à l'aide de l'assistant Microsoft LoggerMessage.

Une fois que vous avez envoyé des événements de journal, ouvrez Kibana (par exemple http: // localhost: 5601 / ) et définissez un modèle d'index pour "dotnet- *" avec le filtre temporel "@timestamp" (c'est le modèle d'index par défaut pour le fournisseur d'enregistrement).

Remarque: Pour utiliser l'index logging- *, conformément à la question, vous devrez également modifier un paramètre de configuration et ajouter ce qui suit à votre fichier appsettings.json:

{
  "Logging": {
    "Elasticsearch": {
      "Index": "logging-{0:yyyy.MM.dd}"
    }
  }
}

Vous pouvez ensuite découvrir les événements du journal pour l'index. Certaines colonnes utiles à ajouter sont log.level, log.logger, event.code, message, tags et process.thread.id.

Si vous exécutez plusieurs applications ou sur plusieurs serveurs, vous souhaiterez peut-être inclure service.type, service.version et Host.hostname.

Des champs supplémentaires sont définis ci-dessous, et toutes les valeurs de message et de portée individuelles sont enregistrées sous forme d'étiquettes. * Paires clé/valeur personnalisées, par ex. labels.CustomerId.

Un des avantages d'ElasticsearchLoggerProvider est qu'il suit le Elasticsearch Common Schema (ECS) pour les champs, il est donc compatible avec d'autres applications qui se connectent à Elasticsearch (par exemple Beats).

Exemple de sortie: Exemple - Sortie Elasticsearch via Kibana

0
Sly Gryphon

Personnellement, j'utilise Filebeat pour collecter les journaux de différentes sources, ajouter un champ personnalisé pour chacun d'eux (comme app: "myappp1") et l'afficher dans Elasticsearch. Ensuite, je crée des requêtes dans Kibana en fonction de ces champs. Exemple:

filebeat.inputs:

- type: log
  enabled: true
  paths:
    - C:\ProgramData\Elastic\Elasticsearch\logs\*
  fields:
    app: "elasticsearch"

- type: log
  enabled: true
  paths:
    - C:\temp\log\myapp1\*
  fields:
app: "myapp1"

Bien que si vous voulez vraiment avoir plusieurs index, je recommande d'utiliser Logstash , qui peut créer un index en utilisant des modèles ou le nom d'un champ. Cette question a de bonnes réponses sur l'utilisation de logstash pour créer plusieurs index.

0
victortv