왜log4j의 개념 모델이 틀렸습니까--zlog의 모델 소개
2845 단어 log4jsyslog로그 함수 라이브러리zloglog4c
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의 디자이너는 계승이라는 두 글자에 눈이 멀어서 계승이 모든 문제를 해결하는 묘약이라고 생각했을 것이다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Spring Boot에서 log4j 로깅 방법Spring Boot은 모든 내부 로그에 Commons Logging을 사용하지만, 기본 설정은 Java Util Logging, Log4J, Log4J2, Logback과 같은 일반적인 로그를 지원합니다.각 Log...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.