Hexlog contient un système de journalisation inspiré par log4j écrit en haxe
Trouvez plus d'informations sur Hexmachina sur hexmachina.org
Les applications utilisant l'API Hexlog demanderont un enregistreur avec un nom spécifique du LogManager. Le LogManager localisera le logger Context approprié, puis obtiendra le journal. Si le journaliste doit être créé, il sera associé au journal de connexion qui contient soit: a) le même nom que le journaliste, b) le nom d'un package parent, ou c) le journal de connexion racine. Les objets LoggerConfig sont créés à partir des déclarations de logger dans la configuration. Le LoggerConfig est associé aux logtargets qui fournissent réellement les Logevents.
Le plus grand avantage de l'utilisation de Hexlog sur trace standard est la possibilité de désactiver certaines instructions de journal tout en permettant à d'autres imprimer sans aucun changement. Cette capacité suppose que l'espace de journalisation, c'est-à-dire l'espace de toutes les déclarations de journalisation possibles, est classé selon certains critères choisis par les développeurs. Les journalistes et les connexions Logger sont nommées entités. Les noms d'enregistrement sont sensibles à la casse et ils suivent la règle de dénomination hiérarchique.
Hiérarchie de dénomination
Un loggerconfig serait un ancêtre d'un autre loggerConfig si son nom suivi d'un point (
.) Est un préfixe d'un nom de bûcheron descendant . Un enregistrement de connexion serait un parent d'un enfant loggerconfig s'il n'y a pas d'ancêtres entre lui-même et le LoggerConfig descendant.
Par exemple, le loggerconfig nommé "com.foo" est un parent du loggerconfig nommé "com.foo.Bar" . De même, "hex" est un parent de "hex.log" et un ancêtre de "hex.log.Logger" . Ce schéma de dénomination devrait être familier à la plupart des développeurs. Le journal de rootconfig réside en haut de la hiérarchie. C'est exceptionnel en ce qu'il existe toujours et fait partie de chaque hiérarchie. Un enregistreur qui est directement lié au ROO LoggerConfig peut être obtenu comme suit:
var rootLogger = LogManager . getLogger ( " " );
// or more simply
var rootLogger = LogManager . getRootLogger (); Tous les autres journalistes peuvent être récupérés en utilisant la méthode statique Logmanager.getLogger en passant le nom de l'enregistreur souhaité.
Le LoggerContext agit comme le point d'ancrage du système de journalisation. Actuellement, il n'est pas possible d'avoir plusieurs LoggerContexts, mais vous pouvez modifier l'implémentation LoggerContext en modifiant la valeur d'une propriété statique LogManager.context .
Dans le cas où vous souhaitez utiliser la journalisation dans le contexte de macro, vous pouvez utiliser MacroLoggerContext déjà préparé qui a une usine de messages préconfigurée et des messages conçus spécifiquement pour l'impression d'expressions.
LoggerContext a une Configuration active. La configuration contient tous les logtargets, filtres à l'échelle du contexte et loggerConfigs.
Comme indiqué précédemment, Logger peut être créé en appelant LogManager.getLogger . L'enregistreur lui-même ne fait aucune action directe. Il a simplement un nom et est associé à un loggerConfig. Il étend AbstractLogger et met en œuvre les méthodes requises. Comme la configuration est modifiée, les journalistes peuvent devenir associés à un autre journal de connexion, ce qui a entraîné la modification de leur comportement.
L'appel de la méthode LogManage.getLogger avec le même nom renverra toujours une référence à exactement le même objet Logger. Cela signifie:
var x = LogManager . getLogger ( " something " );
var y = LogManager . getLogger ( " something " ); x et y se référez-vous exactement au même objet logger. ( x == y est toujours true )
La configuration de l'environnement Hexlog est toujours effectuée à l'initialisation de l'application.
Hexlog facilite le nom des journalistes par composant logiciel . Cela peut être accompli en instanciant l'enregistreur dans chaque classe, avec le nom d'enregistreur égal au nom entièrement qualifié de la classe. Il s'agit d'une méthode utile et simple pour définir les journalistes. Comme la sortie du journal porte le nom de l'enregistreur de génération, cette stratégie de dénomination facilite l'identification de l'origine du message du journal. Cependant, ce n'est qu'une stratégie possible de nommer les bûcherons et Hexlog ne restreint pas l'ensemble possible de bûcherons. Le développeur est toujours libre de nommer les bûcherons comme vous le souhaitez.
For Comocince Hexlog fournit un ensemble de fonctions que vous pouvez importer pour générer automatiquement des appels getLogger . Il est particulièrement pratique lors de l'utilisation du fichier import.hx . (Voir exemple)
Les méthodes de commodité supplémentaires sont getLoggerByClass et getLoggerByInstance qui sont utiles dans un contexte macro où vous ne pouvez pas utiliser la classe de commodité Hexlog.
Les objets LoggerConfig sont créés lorsque les journalistes sont déclarés dans la configuration de la journalisation. Le loggerConfig contient un ensemble de filtres qui doivent permettre au Logevent de passer avant qu'il ne soit transmis à n'importe quel logtarget. Il contient également une référence à l'ensemble de logtargets qui devraient être utilisés pour traiter l'événement.
En plus du filtrage automatique de Loglevel, Hexlog fournit des filtres qui peuvent être appliqués:
Plus d'informations sur les filtres et le filtrage
La possibilité d'activer sélectivement ou de désactiver les demandes de journalisation en fonction de leur enregistreur n'est qu'une partie de l'image. Hexlog permet d'imprimer les demandes de journalisation vers plusieurs destinations. Dans Hexlog Speak, une destination de sortie est appelée logtarget.
Plus d'informations sur les cibles du journal
Plus souvent qu'autrement, les utilisateurs souhaitent personnaliser non seulement la destination de sortie mais aussi le format de sortie. Ceci est accompli en associant une mise en page à un LogTarget. La disposition est responsable de la mise en forme du Logevent aux souhaits de l'utilisateur, tandis qu'une cible de journal s'occupe de l'envoi de la sortie formatée à sa destination.
Plus d'informations sur les dispositions
En interne dans le système, chaque instruction de journal est représentée par un objet de message.
Plus d'informations sur les messages
// Getting logger
var logger = LogManager . getLogger ( " LoggerName " );
// Logging simple message
logger . debug ( " Some message " );
// Logging message with parameters
var name = " World " ;
logger . debug ( " Hello {} " , [ name ]);HexLog FocaliseSi vous prévoyez de vous connecter largement, c'est une bonne pratique pour d'abord obtenir Looger pour votre classe, puis l'utiliser pour envoyer vos messages
import hex . log . HexLog . * ; // Import all convenience functions
// If you're planning to use logger extensively, first get logger for your class
var logger = getLogger ();
// Gets replaced with:
// var logger = hex.log.LogManager.getLogger("my.current.class");
logger . debug ( " Hello world! " ); // you can now use logger as usualSi vous avez juste besoin d'une instruction de débogage simple et que vous n'êtes pas inquiet des performances, vous pouvez utiliser des fonctions encore plus abstraites.
import hex . log . HexLog . * ; // Import all convenience functions
debug ( " Hello world " );
info ( " Hello world " );
warn ( " Hello world " );
error ( " Hello world " );
fatal ( " Hello world " );
// Gets replaced with:
// hex.log.LogManager.getLogger("my.current.class").debug("Hello world");
// ... etc // -- You can see this working in hex.log.ConfigurationTest.hx
// Create a new configuration
var configuration = new BasicConfiguration ();
// Create log targets
var traceTarget = new TraceLogTarget ( " Trace " , null , new DefaultTraceLogLayout ());
// Create a logger config and add targets
// (at this point we can also add filters to the configuration etc.)
var lc1 : LoggerConfig = LoggerConfig . createLogger ( " hex " , LogLevel . WARN , null , null ); // Logger will only forward warnings and higher
lc1 . addLogTarget ( traceTarget , LogLevel . ALL , null ); // Target will accept every event that arrives (in this case only warnings+ will be forwarded from the logger anyway)
configuration . addLogger ( lc1 . name , lc1 ); // Add logger config to the configuration
// Apply the configuration
LoggerContext . getContext (). setConfiguration ( configuration );
// Now you can request loggers and log as much you want and they will follow the rules set above
var logger = LogManager . getLogger ( " hex " );
logger . debug ( " test " ); // Fitered by config -> nothing will happen
logger . warn ( " test " ); // will be logged
var logger2 = LogManager . getLogger ( " hex.log " );
logger2 . debug ( " test " ); // Fitered by parent config -> nothing will happen
logger2 . warn ( " test " ); // will be logged
// NOTE: By default root logger is set to LogLevel.ERROR
var logger3 = LogManager . getLogger ( " something " );
logger3 . debug ( " test " ); // Filtered by root logger -> nothing will happen
logger3 . error ( " test " ); // will be logged