Hexlog contiene un sistema de registro inspirado en log4j escrito en haxe
Encuentre más información sobre Hexmachina en hexmachina.org
Las aplicaciones que utilizan la API Hexlog solicitarán un registrador con un nombre específico del logManager. LogManager ubicará el LoggerContext apropiado y luego obtendrá el registrador de él. Si se debe crear el registrador, se asociará con loggerConfig que contiene: a) el mismo nombre que el Logger, b) el nombre de un paquete principal, o c) el Root LoggerConfig. Los objetos LoggerConfig se crean a partir de declaraciones de Logger en la configuración. El LoggerConfig se asocia con los LogTargets que realmente entregan los LogEvents.
La mayor ventaja de usar Hexlog sobre trace estándar es la capacidad de deshabilitar ciertas declaraciones de registro, al tiempo que permite que otros se impriman sin ningún cambio. Esta capacidad supone que el espacio de registro, es decir, el espacio de todas las declaraciones de registro posibles, se clasifica de acuerdo con algunos criterios elegidos por el desarrollador. Loggers y LoggerConfigs se nombran entidades. Los nombres de los registradores son sensibles a los casos y siguen la regla de denominación jerárquica.
Jerarquía de nombres
Se dice que un LoggerConfig es un antepasado de otro LoggerConfig si su nombre seguido de un punto (
.) Es un prefijo de un nombre de logger descendiente . Se dice que un LoggerConfig es padre de un niño LoggerConfig si no hay antepasados entre sí mismo y el descendiente LoggerConfig.
Por ejemplo, el LoggerConfig llamado "com.foo" es padre del LoggerConfig llamado "com.foo.Bar" . Del mismo modo, "hex" es un padre de "hex.log" y un antepasado de "hex.log.Logger" . Este esquema de nombres debería ser familiar para la mayoría de los desarrolladores. El Root LoggerConfig reside en la parte superior de la jerarquía. Es excepcional porque siempre existe y es parte de cada jerarquía. Se puede obtener un registrador que está directamente vinculado al ROO LoggerConfig de la siguiente manera:
var rootLogger = LogManager . getLogger ( " " );
// or more simply
var rootLogger = LogManager . getRootLogger (); Todos los demás registradores se pueden recuperar utilizando el método estático Logmanager.getLogger pasando el nombre del registrador deseado.
El LoggerContext actúa como el punto de anclaje del sistema de registro. Actualmente no es posible tener múltiples LoggerContexts, pero puede cambiar la implementación de LoggerContext cambiando el valor de una propiedad estática LogManager.context .
En caso de que desee usar el registro dentro del contexto macro, puede usar MacroLoggerContext ya preparado que tiene una fábrica de mensajes preconfigurada y mensajes diseñados específicamente para imprimir expresiones.
LoggerContext tiene una Configuration activa. La configuración contiene todos los logTargets, filtros de todo el contexto y loggerConfigs.
Como se indicó anteriormente, Logger se puede crear llamando LogManager.getLogger . El registrador en sí no realiza acciones directas. Simplemente tiene un nombre y está asociado con un LoggerConfig. Extiende AbstractLogger e implementa los métodos requeridos. Como la configuración se modifica, los registradores pueden asociarse con un LoggerConfig diferente, lo que hace que su comportamiento se modifique.
Llamar al método LogManage.getLogger con el mismo nombre siempre devolverá una referencia al mismo objeto de registrador. Eso significa:
var x = LogManager . getLogger ( " something " );
var y = LogManager . getLogger ( " something " ); x e y se refieren exactamente al mismo objeto Logger. ( x == y siempre es true )
La configuración del entorno HEXLOG siempre se realiza en la inicialización de la aplicación.
Hexlog facilita el nombre del componente de software . Esto se puede lograr instanciando el registrador en cada clase, con el nombre del registrador igual al nombre totalmente calificado de la clase. Este es un método útil y directo para definir registradores. Como la salida de registro lleva el nombre del registrador generador, esta estrategia de nombres facilita identificar el origen del mensaje de registro. Sin embargo, esta es solo una posible estrategia de nombrar registradores y Hexlog no restringe el posible conjunto de registradores. El desarrollador siempre es gratuito para nombrar a los registradores como se desee.
Por conveniencia, Hexlog proporciona un conjunto de funciones que puede importar para generar llamadas getLogger automáticamente. Es especialmente útil cuando se usa el archivo import.hx . (Ver ejemplo)
Los métodos de conveniencia adicionales son getLoggerByClass y getLoggerByInstance que son útiles en el contexto macro donde no puede usar la clase de conveniencia Hexlog.
Los objetos loggerCig se crean cuando se declaran registradores en la configuración de registro. El LoggerConfig contiene un conjunto de filtros que deben permitir que el logEvent pase antes de que se pase a cualquier logTargets. También contiene referencia al conjunto de LogTargets que deben usarse para procesar el evento.
Además del filtrado automático de filtrado de Loglevel, HEXLOG proporciona filtros que se pueden aplicar:
Más información sobre filtros y filtrado
La capacidad de habilitar o deshabilitar selectivamente las solicitudes de registro en función de su registrador es solo una parte de la imagen. Hexlog permite imprimir las solicitudes de registro a múltiples destinos. En Hexlog Speak, un destino de salida se llama logTarget.
Más información sobre objetivos de registro
La mayoría de las veces, los usuarios desean personalizar no solo el destino de salida sino también el formato de salida. Esto se logra asociando un diseño con un LogTarget. El diseño es responsable de formatear el LogEvent a los deseos del usuario, mientras que un objetivo de registro se encarga de enviar la salida formateada a su destino.
Más información sobre diseños
Internamente en el sistema, cada declaración de registro está representada por un objeto de mensaje.
Más información sobre mensajes
// 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 de convenienciaSi está planeando registrar ampliamente, es una buena práctica obtener primero a LOOGER de su clase y luego usarla para enviar sus mensajes
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 solo necesita una declaración de depuración simple y no le preocupa el rendimiento, puede usar funciones aún más abstractas.
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