Section courante

A propos

Section administrative du site

 Langage  Elément  Tutoriel  Annexe 
ABAP/4
Ada
Assembleur
Assembly & bytecode
ASP (Active Server Pages)
Basic
C
C++
C# (C Sharp)
Cobol
ColdFusion
Fortran
HTML
Java
JavaScript
LISP
Logo
LotusScript
Oberon
Pascal
Perl
PHP
PL/1
Prolog
Python
Rebol
REXX
Ruby
SAS
NoSQL
SQL
Swift
X++ (Axapta)
GNAT
SMALLAda
VHDL
Assembleur 370
Assembleur 1802
Assembleur 4004
Assembleur 6502
Assembleur 6800
Assembleur 68000
Assembleur 8080 et 8085
Assembleur 8089
Assembleur 80x86
Assembleur AGC4
Assembleur ARM
Assembleur DPS 8000
Assembleur i860
Assembleur Itanium
Assembleur MIPS
Assembleur PDP-11
Assembleur PowerPC
Assembleur RISC-V
Assembleur SPARC
Assembleur SuperH
Assembleur UNIVAC I
Assembleur VAX
Assembleur Z80
Assembleur Z8000
Assembleur z/Architecture
ASSEMBLER/MONITOR 64
Micol Assembler
GFA Assembler
A86
MASM (Macro Assembler)
TASM (Turbo Assembler)
CIL
Jasmin
LLVM
MSIL
Parrot
P-Code (PCode)
SWEET16
G-Pascal
ASP 1.0
ASP 2.0
ASP 3.0
ASP.NET
ASP.NET Core
ABasiC (Amiga)
Adam SmartBASIC
Altair BASIC
AmigaBASIC (Amiga)
AMOS Basic (Amiga)
Atari Basic (Atari 400, 600 XL, 800, 800XL)
Basic Apple II (Integer BASIC/APPLESOFT)
Basic Commodore 64 (CBM-BASIC)
Basic Commodore 128 (BASIC 7.0)
Basic Commodore VIC-20 (CBM-BASIC 2.0)
Basic Coco 1 (Color Basic)
Basic Coco 2 (Extended Color Basic)
Basic Coco 3 (Extended Color Basic 2.0)
BASICA (PC DOS)
Basic Pro
BBC BASIC
Blitz BASIC (Amiga)
DarkBASIC
Dartmouth BASIC
GFA-Basic (Atari ST/Amiga)
GWBASIC (MS-DOS)
Liberty BASIC
Locomotive BASIC (Amstrad CPC)
MSX-Basic
Omikron Basic (Atari ST)
Oric Extended Basic
Power Basic
Quick Basic/QBasic (MS-DOS)
Sinclair BASIC (ZX80, ZX81, ZX Spectrum)
ST BASIC (Atari ST)
Turbo Basic
Vintage BASIC
VBScript
Visual Basic (VB)
Visual Basic .NET (VB .NET)
Visual Basic pour DOS
Yabasic
BeckerBASIC
SIMONS' BASIC
Basic09 d'OS-9
Disk Extended Color Basic
Basic09 d'OS-9
Disk Extended Color Basic
Access
Excel
Visual Basic pour Windows
Visual Basic .NET pour Windows
C Shell Unix (csh)
C pour Amiga
C pour Atari ST
C pour DOS
C pour Falcon030
C pour GEMDOS (Atari ST)
C pour Linux
C pour PowerTV OS
C pour OS/2
C pour Unix
C pour Windows
Aztec C
CoCo-C
GNU C
HiSoft C
IBM C/2
Introl-C
Lattice C
Microsoft C
MinGW C
MSX-C
Open Watcom C
OS-9 C Compiler
Pure C
Quick C
Turbo C
HiSoft C for Atari ST
HiSoft C for CP/M (Amstrad CPC)
C++ pour OS/2
C++ pour Windows
Borland C++
C++Builder
IBM VisualAge C++
Intel C++
MinGW C++
Open Watcom C++
Symantec C++
Turbo C++
Visual C++
Visual C++ .NET
Watcom C++
Zortech C++
C# (C Sharp) pour Windows
Apple III Cobol
Microsoft Cobol
BlueDragon
Lucee
OpenBD
Railo
Smith Project
Microsoft Fortran
WATFOR-77
CSS
FBML
Open Graph
SVG
XML
XSL/XSLT
LESS
SASS
GCJ (GNU)
JSP
Jython
Visual J++
Node.js
TypeScript
AutoLISP
ACSLogo
LotusScript pour Windows
Amiga Oberon
Oberon .NET
Apple Pascal
Delphi/Kylix/Lazarus
Free Pascal
GNU Pascal
HighSpeed Pascal
IBM Personal Computer Pascal
Lisa Pascal
Maxon Pascal
MPW Pascal
OS-9 Pascal
OSS Personal Pascal
Pascal-86
Pascal du Cray Research
Pascal/VS
Pascal-XT
PURE Pascal
QuickPascal
RemObjets Chrome
Sun Pascal
THINK Pascal
Tiny Pascal (TRS-80)
Turbo Pascal
UCSD Pascal
VAX Pascal
Virtual Pascal
Turbo Pascal for CP/M-80
Turbo Pascal for DOS
Turbo Pascal for Macintosh
Turbo Pascal for Windows
CodeIgniter (Cadre d'application)
Drupal (Projet)
Joomla! (Projet)
Phalanger (PHP .NET)
phpBB (Projet)
Smarty (balise)
Twig (balise)
Symfony (Cadre d'application)
WordPress (Projet)
Zend (Cadre d'application)
PL360
PL/M-80
PL/M-86
Turbo Prolog
CPython
IronPython
Jython
PyPy
AREXX
Regina REXX
JMP
Btrieve
Cassandra
Clipper
CouchDB
dBASE
Hbase
Hypertable
MongoDB
Redis
Access
BigQuery
DB2
H2
Interbase
MySQL
Oracle
PostgreSQL
SAP HANA
SQL Server
Sybase
U-SQL
Introduction
Référence des espaces de noms
Les premiers pas
Notions de base sur la configuration
Journal d'écriture des événements
Données structurées
Débogage et diagnostic
Fournisseur de récepteurs (Sink)

Notions de base sur la configuration

Le Serilog utilise une API en C# simple pour configurer la journalisation. Lorsqu'une configuration externe est souhaitable, elle peut être intégrée (avec parcimonie) à l'aide du paquet Serilog.Settings.AppSettings ou du paquet Serilog.Settings.Configuration.

Création d'un journal de bord

Les journal de bord sont créés à l'aide d'un objet LoggerConfiguration :

  1. Log.Logger = new LoggerConfiguration().CreateLogger();
  2. Log.Information("Personne ne m'écoute !");
  3.  
  4. // Enfin, une fois juste avant la sortie de l'application...
  5. Log.CloseAndFlush();

L'exemple ci-dessus va créer un journal de bord n'enregistrant aucun événement nulle part. Pour voir les événements du journal, un récepteur doit être configuré.

Sinks

Les récepteurs (Sinks) d'événements de journal enregistrent généralement les événements de journal dans une représentation externe, généralement la console, un fichier ou un magasin de données. Les récepteurs Serilog sont distribués via NuGet.

Cet exemple utilisera le paquet de récepteur de console, affichant joliment les données de journal, et le paquet de récepteur de fichier, écrivant les événements de journal dans un ensemble de fichiers texte horodatés :

dotnet add package Serilog.Sinks.Console
dotnet add package Serilog.Sinks.File

Les récepteurs sont configurés à l'aide de l'objet de configuration WriteTo.

  1. Log.Logger = new LoggerConfiguration()
  2.     .WriteTo.Console()
  3.     .CreateLogger();
  4.  
  5. Log.Information("Ah, vous voilà !");

Plusieurs récepteurs peuvent être actifs en même temps. L'ajout de récepteurs supplémentaires est aussi simple que l'enchaînement de blocs WriteTo :

  1. Log.Logger = new LoggerConfiguration()
  2.     .WriteTo.Console()
  3.     .WriteTo.File("log-.txt", rollingInterval: RollingInterval.Day)
  4.     .CreateLogger();

Gabarits de sortie

Les récepteurs basés sur du texte utilisent des modèles de sortie pour contrôler le formatage. Cela peut être modifié via le paramètre outputTemplate :

  1. .WriteTo.File("log.txt",
  2.      outputTemplate: "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level:u3}] {Message:lj}{NewLine}{Exception}

Le gabarit par défaut, illustré dans l'exemple ci-dessus, utilise des propriétés intégrées telles que Timestamp et Level. Les propriétés des événements, y compris celles attachées à l'aide d'enrichisseurs, peuvent également apparaître dans le gabarit de sortie.

Les options de format {Message:lj} entraînent la sortie des données intégrées dans le message au format JSON (j), à l'exception des littéraux de chaîne de caractères, étant sortis tels quels.

Pour des noms de niveau plus compacts, utilisez un format tel que {Level:u3} ou {Level:w3} pour les noms de niveau à trois caractères majuscules ou minuscules, respectivement.

Ajoutez {Properties:j} au modèle de sortie pour inclure des informations contextuelles supplémentaires.

Niveau minimum

Serilog implémente le concept commun de «niveau minimum» pour le traitement des événements de journal :

  1. Log.Logger = new LoggerConfiguration()
  2.     .MinimumLevel.Debug()
  3.     .WriteTo.Console()
  4.     .CreateLogger();     

L'objet de configuration MinimumLevel permet de spécifier l'un des niveaux d'événements de journal comme minimum. Dans l'exemple ci-dessus, les événements de journal avec le niveau Debug et supérieur seront traités et finalement écrits sur la console.

Niveau Utilisation
Verbose Verbose est le niveau le plus détaillé, rarement (voire jamais) activé pour une application de production.
Debug Le débogage est utilisé pour les événements système internes qui ne sont pas nécessairement observables de l'extérieur, mais utiles pour déterminer comment quelque chose s'est produit.
Information Les événements d'information décrivent les événements se produisant dans le système et correspondant à ses responsabilités et fonctions. Il s'agit généralement des actions observables que le système peut effectuer.
Warning Lorsque le service est dégradé, menacé ou se comporte en dehors de ses paramètres attendus, des événements de niveau d'avertissement sont utilisés.
Error Lorsque la fonctionnalité n'est pas disponible ou que les attentes ne sont pas satisfaites, un événement d'erreur est utilisé.
Fatal Le niveau le plus critique, les événements fatals nécessitent une attention immédiate.

Niveau par défaut : si aucun niveau minimum n'est spécifié, les événements de niveau Information et supérieurs seront traités.

Remplacement par sink

Parfois, il est souhaitable d'écrire des journaux détaillés sur un support, mais des journaux moins détaillés sur un autre.

  1. Log.Logger = new LoggerConfiguration()
  2.     .MinimumLevel.Debug()
  3.     .WriteTo.File("log.txt")
  4.     .WriteTo.Console(restrictedToMinimumLevel: LogEventLevel.Information)
  5.     .CreateLogger();

Dans cet exemple, les journaux de débogage seront écrits dans le fichier de roulement, tandis que seuls les journaux de niveau Information et supérieur seront écrits dans la console.

Tous les récepteurs fournis prennent en charge le paramètre de configuration restrictedToMinimumLevel.

Minimums du journal et du récepteur : il est important de comprendre que le niveau de journalisation ne peut être augmenté que pour les récepteurs, et non abaissé. Ainsi, si le MinimumLevel du journal est défini sur Information, un récepteur avec Debug comme niveau spécifié ne verra toujours que les événements de niveau Information. Cela est dû au fait que la configuration au niveau du journal contrôle les instructions de journalisation entraînant la création d'événements, tandis que la configuration au niveau du récepteur ne filtre que ceux-ci. Pour créer un seul journal avec un niveau plus détaillé, utilisez une LoggerConfiguration distincte.

Enrichisseurs

Les enrichisseurs sont des composantes simples ajoutant, supprimant ou modifiant les propriétés attachées à un événement de journal. Cela peut être utilisé pour attacher un identificateur de processus léger à chaque événement, par exemple :

  1. class ThreadIdEnricher : ILogEventEnricher
  2. {
  3.     public void Enrich(LogEvent logEvent, ILogEventPropertyFactory propertyFactory)
  4.     {
  5.         logEvent.AddPropertyIfAbsent(propertyFactory.CreateProperty(
  6.                 "ThreadId", Thread.CurrentThread.ManagedThreadId));
  7.     }
  8. }

Les enrichisseurs sont ajoutés à l'aide de l'objet de configuration Enrich :

  1. Log.Logger = new LoggerConfiguration()
  2.     .Enrich.With(new ThreadIdEnricher())
  3.     .WriteTo.Console(
  4.         outputTemplate: "{Timestamp:HH:mm} [{Level}] ({ThreadId}) {Message}{NewLine}{Exception}")
  5.     .CreateLogger();

La configuration ci-dessus montre comment une propriété ajoutée par un enrichisseur peut être utilisée dans la mise en forme de sortie.

Si la valeur de la propriété enrichie est constante tout au long de l'exécution de l'application, la méthode de raccourci WithProperty peut être utilisée pour simplifier la configuration.

  1. Log.Logger = new LoggerConfiguration()
  2.     .Enrich.WithProperty("Version", "1.0.0")
  3.     .WriteTo.Console()
  4.     .CreateLogger();

Les enrichisseurs et les propriétés qu'ils attachent sont généralement plus utiles avec les récepteurs utilisant un entreposage structuré, où les valeurs de propriété peuvent être visualisées et filtrées.

Filtres

Les événements peuvent être enregistrés de manière sélective par filtrage. Les filtres ne sont que des prédicats sur LogEvent, avec certains scénarios courants gérés par la classe Matching :

  1. Log.Logger = new LoggerConfiguration()
  2.     .WriteTo.Console()
  3.     .Filter.ByExcluding(Matching.WithProperty<int>("Count", p => p < 10))
  4.     .CreateLogger();

Sous-journal de bord

Parfois, un niveau de contrôle plus fin sur ce qui est vu par un récepteur est nécessaire. Pour cela, Serilog permet à un pipeline de journalisation complet d'agir comme un récepteur :

  1. Log.Logger = new LoggerConfiguration()
  2.     .WriteTo.Console()
  3.     .WriteTo.Logger(lc => lc
  4.         .Filter.ByIncludingOnly(...)
  5.         .WriteTo.File("log.txt"))
  6.     .CreateLogger();

Pour les scénarios mal gérés par les sous-journal de bord, il est possible de créer plusieurs pipelines indépendants de niveau supérieur. Un seul pipeline peut être attribué à Log.Logger, mais votre application peut utiliser autant d'instances ILogger supplémentaires que nécessaire.

Notez que les stratégies de déstructuration n'auront aucun effet si elles sont spécifiées dans le rappel WriteTo.Logger(), car les sous-enregistreurs fonctionnent avec des LogEvents déjà créés.



PARTAGER CETTE PAGE SUR
Dernière mise à jour : Vendredi, le 13 septembre 2024