Hexlog содержит систему ведения журнала, вдохновленная log4j, написанную в Haxe
Найдите больше информации о Hexmachina на hexmachina.org
Приложения с использованием API HexLog будут запрашивать регистратор с определенным именем от Logmanager. Logmanager найдет соответствующий LoggerContext, а затем получит из него регистратор. Если регистратор должен быть создан, он будет связан с LoggerConfig, который содержит либо: a) то же имя, что и Logger, б) имя родительского пакета, либо c) корневой loggerConfig. Объекты LoggerConfig создаются из объявлений регистрации в конфигурации. LoggerConfig связан с LogTargets, которые фактически доставляют LogEvents.
Самым большим преимуществом использования hexlog по стандартной trace является возможность отключить определенные операторы журнала, позволяя напечатать другие без каких -либо изменений. Эта возможность предполагает, что пространство для регистрации, то есть пространство всех возможных операторов ведения журнала, классифицируется в соответствии с некоторыми критериями, выбранными разработчиком. Логдеры и loggerConfigs называются объектами. Имена регистраторов чувствительны к случаям, и они следуют иерархическому правилу именования.
Иерархия именования
Говорят, что LoggerConfig является предком другого LoggerConfig, если его название, сопровождаемое точкой (
.), Является префиксом имени Logger . Говорят, что LoggerConfig является родителем ребенка LoggerConfig, если нет предков между собой и потомком LoggerConfig.
Например, LoggerConfig с именем "com.foo" является родителем LoggerConfig с именем "com.foo.Bar" . Точно так же "hex" является родителем "hex.log" и предком "hex.log.Logger" . Эта схема именования должна быть знакома большинству разработчиков. Root LoggerConfig находится на вершине иерархии. Это исключительно в том, что он всегда существует и является частью каждой иерархии. Регистратор, который непосредственно связан с ROO LoggerConfig, может быть получен следующим образом:
var rootLogger = LogManager . getLogger ( " " );
// or more simply
var rootLogger = LogManager . getRootLogger (); Все остальные регистраторы могут быть извлечены с помощью статического метода Logmanager.getLogger , передавая имя желаемого регистратора.
LoggerContext действует как точка привязки системы журнала. В настоящее время невозможно иметь несколько LoggerContexts, но вы можете изменить реализацию LoggerContext, изменив значение статического свойства LogManager.context .
В случае, если вы хотели бы использовать ведение журнала в контексте макроса, вы можете использовать уже подготовленный MacroLoggerContext , который имеет предварительно настроенный завод сообщений и сообщения, разработанные специально для печати выражений.
LoggerContext имеет активную Configuration . Конфигурация содержит все logtargets, фильтры в контексте и loggerConfigs.
Как указывалось ранее, Logger может быть создан, вызывая LogManager.getLogger . Сам регистратор не выполняет прямых действий. Он просто имеет имя и связан с LoggerConfig. Он расширяет AbstractLogger и реализует необходимые методы. Поскольку конфигурация модифицирована, регистраторы могут быть связаны с другим LoggerConfig, что приводит к изменению их поведения.
Вызов метод LogManage.getLogger с одним и тем же именем всегда будет возвращать ссылку на тот же самый объект логиста. Это означает:
var x = LogManager . getLogger ( " something " );
var y = LogManager . getLogger ( " something " ); x и y относятся к точному же объекту регистрации. ( x == y всегда true )
Конфигурация среды hexlog всегда осуществляется при инициализации приложения.
Hexlog позволяет легко назвать регистраторы программным компонентом . Это может быть достигнуто путем создания жесткого регистрации в каждом классе, и имя регистратора равна полностью квалифицированному имени класса. Это полезный и простой метод определения регистраторов. Поскольку вывод журнала носит имя генерирующего регистратора, эта стратегия именования позволяет легко идентифицировать происхождение сообщения журнала. Однако это только одна из возможных стратегии названия регистраторов, а Hexlog не ограничивает возможный набор логгеров. Разработчик всегда может называть регистраторов по желанию.
Для удобства Hexlog предоставляет набор функций, которые вы можете импортировать для автоматического генерации вызовов getLogger . Это особенно удобно при использовании файла import.hx . (См. Пример)
Дополнительными методами удобства являются getLoggerByClass и getLoggerByInstance , которые полезны в контексте макроса, где вы не можете использовать Commonience Class HexLog.
Объекты LoggerConfig создаются, когда регистраторы объявляются в конфигурации журнала. LoggerConfig содержит набор фильтров, которые должны разрешить LogEvent передать, прежде чем он будет передаваться в любые logTargets. Он также содержит ссылку на набор logTargets, который следует использовать для обработки события.
В дополнение к автоматической фильтрации фильтрации Loglevel Hexlog предоставляет фильтры, которые могут быть применены:
Больше информации о фильтрах и фильтрации
Возможность избирательного включения или отключения запросов журнала на основе их регистратора является лишь частью изображения. HexLog позволяет печатать запросы на регистрацию в несколько направлений. В Hexlog выступает место для вывода называется LogTarget.
Более подробная информация о целях журнала
Чаще всего пользователи хотят настроить не только пункт назначения вывода, но и формат вывода. Это достигается путем связи с макетом с LogTarget. Макет отвечает за форматирование логического сообщества к желаниям пользователя, тогда как цель журнала заботится о отправке форматированного вывода в свой пункт назначения.
Более подробная информация о макетах
Внутренне в системе каждый оператор журнала представлен объектом сообщения.
Больше информации о сообщениях
// 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Если вы планируете широко войти в систему, это хорошая практика сначала получить Looger для вашего класса, а затем использовать его для отправки ваших сообщений
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 usualЕсли вам просто нужно простое заявление отладки, и вы не беспокоитесь о производительности, вы можете использовать еще более абстрактные функции.
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