HexLog에는 Haxe로 작성된 Log4J에서 영감을 얻은 로깅 시스템이 포함되어 있습니다.
Hexmachina.org에서 Hexmachina에 대한 자세한 내용을 확인하십시오
HexLog API를 사용하는 응용 프로그램은 LogManager의 특정 이름이있는 로거를 요청합니다. LogManager는 적절한 LoggerContext를 찾은 다음 Logger를 얻습니다. 로거를 만들어야하는 경우 다음과 같은 로거 콘피드와 관련이 있습니다. LoggerConfig 객체는 구성의 Logger 선언에서 생성됩니다. LoggerConfig는 실제로 Logevents를 제공하는 LogTarget과 관련이 있습니다.
표준 trace 통해 헥 슬로그를 사용하는 가장 큰 장점은 특정 로그 문을 비활성화하면서 다른 사람을 변경하지 않고 인쇄 할 수 있다는 것입니다. 이 기능은 로깅 공간, 즉 가능한 모든 로깅 진술의 공간이 일부 개발자 선택된 기준에 따라 분류된다고 가정합니다. Loggers 및 LoggerConfigs의 이름은 엔티티입니다. 로거 이름은 대소 문자를 사용하며 계층 적 이름 지정 규칙을 따릅니다.
명명 계층
LoggerConfig는 이름과 Dot (
.)이 후손 로거 이름의 접두사 인 경우 다른 LoggerConfig의 조상 이라고합니다. LoggerConfig는 그 자체와 자손 LoggerConfig 사이에 조상이없는 경우 Child LoggerConfig의 부모 라고합니다.
예를 들어, "com.foo" 라는 LoggerConfig는 "com.foo.Bar" 라는 LoggerConfig의 부모입니다. 마찬가지로 "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를 가질 수는 없지만 정적 속성 LogManager.context 의 값을 변경하여 LoggerContext 구현을 변경할 수 있습니다.
매크로 컨텍스트 내에서 로깅을 사용하려면 메시지 공장을 미리 구성한 MacroLoggerContext 와 표현식을 위해 특별히 설계된 메시지를 사용할 수 있습니다.
LoggerContext에는 활성 Configuration 있습니다. 구성에는 모든 로그 타겟, 컨텍스트 전체 필터 및 LoggerConfig가 포함되어 있습니다.
앞에서 언급 한 바와 같이 LogManager.getLogger 호출하여 Logger를 만들 수 있습니다. 로거 자체는 직접적인 행동을 수행하지 않습니다. 단순히 이름이 있고 LoggerConfig와 관련이 있습니다. AbstractLogger를 확장하고 필요한 방법을 구현합니다. 구성이 수정됨에 따라 로거는 다른 로거 콘피그와 관련 될 수 있으므로 동작이 수정됩니다.
LogManage.getLogger 메소드를 동일한 이름으로 호출하면 항상 동일한 Logger 객체에 대한 참조를 반환합니다. 그것은 의미 :
var x = LogManager . getLogger ( " something " );
var y = LogManager . getLogger ( " something " ); x 와 y 정확히 동일한 로거 객체를 나타냅니다. ( x == y 항상 true 입니다)
헥 슬로그 환경의 구성은 항상 애플리케이션 초기화에서 수행됩니다.
HexLog를 사용하면 소프트웨어 구성 요소 별로 로거 이름을 쉽게 지정할 수 있습니다. 이것은 각 클래스에서 로거를 인스턴스화하여 달성 할 수 있으며 로거 이름은 클래스의 자격을 갖춘 이름과 같습니다. 이것은 로거를 정의하는 유용하고 간단한 방법입니다. 로그 출력이 생성 로거의 이름을 갖기 때문에이 명명 전략을 사용하면 로그 메시지의 기원을 쉽게 식별 할 수 있습니다. 그러나 이것은 로거를 명명하는 하나의 가능한 전략 일 뿐이며 Hexlog는 가능한 로거 세트를 제한하지 않습니다. 개발자는 항상 로거를 원하는대로 자유롭게 지정할 수 있습니다.
편의를 위해 Hexlog는 getLogger 통화를 자동으로 생성하기 위해 가져올 수있는 일련의 기능을 제공합니다. import.hx 파일을 사용할 때 특히 편리합니다. (예 참조)
추가 편의 방법은 hexlog 편의 클래스를 사용할 수없는 매크로 컨텍스트에 유용한 getLoggerByClass 및 getLoggerByInstance 입니다.
LoggerConfig 객체는 로깅 구성에서 로거가 선언 될 때 생성됩니다. LoggerConfig에는 Logtarget에 전달되기 전에 Logevent를 전달할 수있는 필터 세트가 포함되어 있습니다. 또한 이벤트를 처리하는 데 사용해야하는 로그 타겟 세트에 대한 참조도 포함되어 있습니다.
자동 로그 레벨 필터링 외에도 헥 슬로그를 적용 할 수있는 필터를 제공합니다.
필터 및 필터링에 대한 자세한 내용
로거를 기반으로 로깅 요청을 선택적으로 활성화 또는 비활성화하는 기능은 사진의 일부일뿐입니다. HexLog를 사용하면 로깅 요청을 여러 대상으로 인쇄 할 수 있습니다. Hexlog Speak에서는 출력 대상을 logtarget이라고합니다.
로그 대상에 대한 자세한 내용
사용자는 종종 출력 대상뿐만 아니라 출력 형식을 사용자 정의하기를 원합니다. 이것은 레이아웃을 logtarget과 연관시킴으로써 달성됩니다. 레이아웃은 Logevent를 사용자의 소원에 서식하는 반면 로그 대상은 형식화 된 출력을 대상으로 보내는 것을 관리합니다.
레이아웃에 대한 자세한 정보
내부적으로 시스템에서 모든 로그 문은 메시지 객체로 표시됩니다.
메시지에 대한 자세한 정보
// 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