왜log4j의 개념 모델이 틀렸습니까--zlog의 모델 소개

만약에 당신의log4j시스템에 이런 설정이 있다면
log4j.logger.aa=ERROR, A1
log4j.logger.aa.bb=
log4j.logger.aa.cc=INFO

aa는 아버지logger입니다.aa.bb와 aa.cc는 aa의 하위 logger입니다.
    aa.bb는 aa's 등급과 출력(appender)을 계승했고 등급은 ERROR, 출력은 A1이다.
    aa.cc는 aa의 등급을 계승하고 덮어씁니다.그래서 aa.cc의 등급은 INFO 출력입니까 아니면 A1입니까?
수요1: 만약에 내가 지금 모든aa의 로그, 모든 단계를 특별한 파일에 출력하고 원래의aa를 유지하고 싶다면.bb、aa.cc의 출력은 변하지 않습니다. 어떻게 실현합니까?
수요2: 내가 aa를 건드렸다고 가정해 봐.bb의 코드, 생산에서 aa를bb의 모든 로그는 DEBUG 레벨에서 aa로 출력됩니다.bb.debug.log, 그리고 aa의 ERROR 이상의 로그를 유지하지 않습니다 (운영자가 그들의 습관을 바꾸지 않고 원래의 로그를 직접 볼 수 있도록)
log4j는 어떻게 이러한 수요를 실현합니까?어려울 수도 있습니다. appender에 한도값 (threshold) 을 도입하거나 하위 logger를 도입하면 부모 logger의 옵션을 계승하지 않습니다.하위 logger는 스스로 등급을 지정하거나 아버지 logger로부터 계승할 수 있습니다.그러나 결국log4j의logger는 반드시 있어야 하고 한 등급만 있어야 하며 등급과logger는 귀속되어 있다.
zlog는 이러한 수요를 어떻게 실현할 것인가?우선,zlog는syslog 프로필의 사상을 계승하여 하나의 분류의 서로 다른 등급이 서로 다른 규칙에 동시에 존재할 수 있다.이것은 같은 분류의 다른 등급의 로그를 다른 로그 파일로 필터하는 것을 가능하게 한다.
aa.debug         “/var/log/aa.debug.log”
aa.=notice       “/var/log/aa.notice.log”

자유로워진 것 같지 않아요?
그 다음으로 zlog에서 모든 규칙 사이에는 독립적이고 부자 관계가 없다.강목 분류의 관계는 분류 문자열 사이의 밑줄에 나타난다.예:
#rule 1
aa_bb.DEBUG         “/var/log/aa_bb.log”

#rule 2
aa_cc.INFO          “/var/log/aa_cc.log”

#rule 3
aa_.ERROR           “/var/log/aa_error.log”

#rule 4
aa.*                “/var/log/aa.log”

계승은 없고 4개의 독립된 규칙만 있다.코드의 분류 이름이 "aa_bb"인 경우코드는 다음과 같습니다.
category_t ab;

ab = zlog_get_category(“aa_bb”);

ZLOG_DEBUG(ab, “ab's debug”);
ZLOG_ERROR(ab, “ab's error”);

구성 중, rule 1의 분류 문자열 "aa_bb'와 rule 3의 분류 문자열'aa_',코드의 이름과 "aa_bb'의 분류 변수는 일치합니다.그래서 코드는 aa_에 속한다bb 분류 변수, >=DEBUG 로그를 aa_로 출력bb.log,aa_bb 분류 변수, >=ERROR이 aa_로 출력됩니다.error.log.ERROR 레벨의 로그는 두 파일에 동시에 기록됩니다.그러나 rule 4의 변수 문자열은'aa'입니다. 분류 변수와 일치하지 않습니다.'aa_bb', 이것은 "aa"이름을 가진 분류 변수와 정확하게 일치합니다.
이것이 바로 강목 분류 모델이다.규칙과 규칙 사이는 분리되어 있다.하나의 코드 분류 변수는 여러 개의 규칙 분류 문자열과 일치할 수 있고, 하나의 규칙은 여러 개의 코드 분류 변수에 속할 수 있다.규칙의 강분류 문자열 (하선으로 끝난) 은 코드의 목분류 변수와 일치하고, 강분류 문자열의 범위는 목분류 문자열을 포함한다.이렇게 하면 사용자는 다른 규칙의 행위에 영향을 주지 않고 임의의 범위의 강목 분류 문자열을 선택하여 출력할 수 있다.
사실, zlog_get_category () 가 호출될 때 코드 분류 변수에 일치하는 규칙 분류 문자열이 있음을 보장하지 않습니다.분류 변수는 그것과 일치하는 규칙이 많을 수도 있고, 하나도 없을 수도 있다. 이것은 프로필이 어떻게 쓰였는지에 달려 있다.구성 파일이 변경되고 zlog_ 호출되면reload () 이후 코드 분류 변수와 규칙 분류 문자열의 일치가 다시 계산됩니다.위에서 말한 일치 방식에 따라 모든 분류 변수는 새로운 프로필에서 자신의 새로운 규칙을 찾을 수 있습니다.
즉, zlog에서 다수출은 여러 규칙에 의해 이루어진 것이지log4j의 여러 appender가 아니다.하나의 규칙은 프로그래머가 어떤 분류와 등급의 로그에 대한 출력 수요를 대표한다.어떤 분류를 지정할 필요가 없다.분류, 등급, 출력 이 세 가지는 자유롭게 조합하여 완전히 결합을 풀 수 있어 매우 큰 유연성을 가져왔다.
유닉스 시스템syslog의 디자이너에게 감사해야 한다. 사상적으로 말하자면 zlog는 그들의 기초 위에서 약간의 변화를 증가시켜 강목 분류에 일치하지만 유연성은 자바 시리즈의 귀속 사상을 훨씬 능가한다.아마도 로그4j의 디자이너는 계승이라는 두 글자에 눈이 멀어서 계승이 모든 문제를 해결하는 묘약이라고 생각했을 것이다.

좋은 웹페이지 즐겨찾기