로깅 규칙 및 조언?


13

우리 조직에서는 로깅에 대한 몇 가지 규칙 / 길드 라인을 정리했습니다. 추가하거나 의견을 달 수 있는지 알고 싶습니다.

우리는 Java를 사용하지만 일반적으로 loggin-규칙 및 조언에 대해 언급 할 수 있습니다.

  1. 올바른 로깅 수준을 사용하십시오.

    • 오류 : 문제가 발생하여 즉시 수정해야합니다.
    • 경고 : 프로세스는 수정하지 않고 계속할 수 있습니다. 응용 프로그램은이 수준을 허용해야하지만 항상 경고를 조사해야합니다.
    • 정보 : 중요한 프로세스가 완료되었다는 정보
    • 디버그 개발 중에 만 사용
  2. 무엇을 기록하고 있는지 확인하십시오.

  3. 로깅이 애플리케이션의 동작에 영향을 미치지 않도록하십시오

로깅 기능은 로그에 메시지를 작성하는 것이어야합니다.

  1. 로그 메시지는 설명적이고 명확하며 짧고 간결해야합니다.

문제 해결시 넌센스 메시지를 많이 사용하지 않습니다.

  1. log4j에 올바른 속성을 넣으십시오.

올바른 방법과 클래스가 자동으로 작성되도록하십시오.

예:

Datedfile-웹

log4j.rootLogger=ERROR, DATEDFILE
log4j.logger.org.springframework=INFO
log4j.logger.waffle=ERROR
log4j.logger.se.prv=INFO
log4j.logger.se.prv.common.mvc=INFO
log4j.logger.se.prv.omklassning=DEBUG

log4j.appender.DATEDFILE=biz.minaret.log4j.DatedFileAppender
log4j.appender.DATEDFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.DATEDFILE.layout.ConversionPattern=%d{HH:mm:ss,SSS} %-5p [%C{1}.%M] - %m%n

log4j.appender.DATEDFILE.Prefix=omklassning.
log4j.appender.DATEDFILE.Suffix=.log
log4j.appender.DATEDFILE.Directory=//localhost/WebSphereLog/omklassning/
  1. 로그 값.

응용 프로그램에서 값을 기록하십시오.

  1. 로그 접두사.

응용 프로그램의 어느 부분에서 로깅을 작성했는지, 바람직하게는 프로젝트에서 동의 한 접두어를 사용하여 작성해야합니다. PANDORA_DB

  1. 텍스트의 양입니다.

로깅 텍스트가 너무 많지 않도록주의하십시오. 앱의 성능에 영향을 줄 수 있습니다.

  1. 로그온 형식 :

log4j와 함께 사용하는 여러 변형 및 방법이 있지만 예외를 기록 할 때 다음 형식을 균일하게 사용하고 싶습니다.

logger.error("PANDORA_DB2: Fel vid hämtning av frist i TP210_RAPPORTFRIST", e);

위의 예제에서 클래스와 메소드를 자동으로 쓰도록 log4j 속성을 설정했다고 가정합니다.

항상 다음이 아닌 로거를 사용하십시오.

System.out.println(), System.err.println(), e.printStackTrace()

웹 애플리케이션이 프레임 워크를 사용하는 경우 핸들러에서 try-catch를 사용하고 위 모델에 따라 로깅하는 경우 EJB에서 매우 자세한 오류 정보를 얻을 수 있습니다.

프로젝트에서 우리는 메소드와 클래스 이름이 자동으로 쓰여지는이 변환 패턴을 사용합니다. 여기서 콘솔과 datedfileappender에 대해 서로 다른 두 가지 특허를 사용합니다.

log4j.appender.CONSOLE.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

log4j.appender.DATEDFILE.layout.ConversionPattern=%d [%t] %-5p %c - %m%n

위의 예와 방법으로 클래스를 작성하십시오. 콘솔에서 행 번호도 작성됩니다.

  1. toString()

toString()모든 물건에 대해 부탁 합니다. 전의:

@Override
public String toString() {
  StringBuilder sb = new StringBuilder();
  sb.append(" DwfInformation [ ");
  sb.append("cc: ").append(cc);
  sb.append("pn: ").append(pn);
  sb.append("kc: ").append(kc);
  sb.append("numberOfPages: ").append(numberOfPages);
  sb.append("publicationDate: ").append(publicationDate);
  sb.append("version: ").append(version);
  sb.append(" ]");
  return sb.toString();
}

이러한 출력을 만드는 특별한 방법 대신

public void printAll()
{
    logger.info("inbet: " + getInbetInput());
    logger.info("betdat: " + betdat);
    logger.info("betid: " + betid);
    logger.info("send: " + send);
    logger.info("appr: " + appr);
    logger.info("rereg: " + rereg);   
    logger.info("NY: " + ny);   
    logger.info("CNT: " + cnt);   
}

로깅을 사용하는 이러한 방법으로 추가, 의견 또는 의심스러운 점이 있습니까? Java, Java 및 log4j와 관련이없는 경우에도 자유롭게 대답하거나 의견을 보내십시오.



1
@ gnat-당신이 옳다고 생각합니다. 두 질문 사이에 많은 중복이 있습니다. 그래도 중복이라고 부르려고 고심하고 있습니다.

답변:


4

애플리케이션에서 로그 문이 나온 로깅 규칙의 확장으로 모듈 레벨 로깅 플래그를 추가 할 수 있습니다. 항상 모든 것을 로깅하는 대신 애플리케이션의 섹션을 선택적으로 대상으로 지정할 수 있습니다. 여기에는 오버 헤드가 있으며 해당 로깅을 활성화 / 비활성화 할 수있는 기능을 만들어야합니다. 이상적으로는 응용 프로그램이 실행되는 동안 즉석에서 활성화 / 비활성화 할 수 있습니다.

필자는 "추적 (Trace)"이라고 부르는 디버그 아래의 계층을 보는 데 익숙하지만 반드시 보편적 인 용어는 아닙니다. "추적"레벨 로깅은 모듈 진입 / 종료, 진입 / 종료 타임 스탬프 및 전달 된 값 캡처를위한 보너스 포인트를 포함하여 가능한 한 많이 추적합니다. 분명히, 그것은 많은 양의 데이터를 생성하며 당신이 윌리-닐리를 켜는 것이 아닙니다. 그러나 프로세스에 연결할 수 없거나 잘못된 응용 프로그램의 코어 덤프가없는 경우 디버깅과 관련하여 장점이 있습니다.

로그 정보와 함께 파일 / 모듈 참조 및 타임 스탬프를보고 싶습니다. 스레드 간의 경쟁 조건을 찾아 내고 응용 프로그램의 여러 영역의 활동을 조정하려고 할 때 편리합니다. 공평하게, 나는 이러한 세부 사항이 로그 파일을 복잡하게 생각한다고 생각하는 사람들을 알고 있습니다. 타임 스탬프에 추가하는 것은 팀과 논의 할 내용입니다. (log4j가 이미 그렇게하는 경우 사과드립니다.)

로깅이 자체 스레드 / 프로세스에 의해 처리되지 않으면 고려해야 할 사항입니다. 응용 프로그램 스레드에서 로깅이 처리 될 때까지 기다리지 않고 로그 메시지가 로그 처리기로 전달되고 응용 프로그램 스레드가 원활하게 진행됩니다. 또는 로그 메시지를 처리하기위한 일종의 버퍼 메커니즘을 만드는 것이 응용 프로그램 응답 속도를 높이는 또 다른 방법입니다.

로그 파일의 크기와 기록을 제어하는 ​​것도 고려해야 할 또 다른 기능입니다. 앱이 호스트 시스템의 모든 디스크 공간을 쏟아 내거나 모든 로그 파일을 영원히 보존하지 않으려는 것은 아닙니다.


2

명심해야 할 것은 로깅을 위해 문자열 조작을하기 전에 로깅 레벨을 확인하는 것입니다. 즉, 실제로 날짜를 기록하지 않을 경우 날짜 포맷터를 설정하거나 많은 문자열을 연결하여 로그 메시지를 작성하는 모든 작업을 수행하지 마십시오. 그것은 단지 응용 프로그램 속도를 저하시키는 작업 낭비입니다.

참고로 Apache Commons 프로젝트에는 메소드 작성을 단순화 하는 ToStringBuilder 클래스toString()있습니다.


1

나는 당신이 여기 Nick에 추가 한 것에 의문의 여지가 없습니다. 이것이 내가 한동안 그렇게해온 방법이다. 제공 한 게시물은 매우 상세하며 로깅에 대한 일종의 자습서로 사용될 수 있습니다. 그러나 여기에 한 가지를 추가하고 싶습니다. 많은 곳에서 조건부 로깅을 사용하여 챕터를 보았습니다. 예 :

     if(env_local)
     {
     write_to_local();
     }    
     else if(env_IT)
     {
     write_to_IT();
     } 
     else if(env_PROD)
     {
     write_to_prod();
     } 
     else
     dosomething();

이런 종류의 조건부 추적 또는 디버깅이 최선의 방법은 아니라고 생각합니다.


1

오류를 일으킨 클래스 / 메소드를 기록하는 것 외에도 해당 메소드에 전달 된 매개 변수를 기록하는 것이 유용합니다. 오류가 발생한 위치를 아는 것은 1000 개 중 1 회만 발생하는 경우 유용하지 않습니다. 또한 오류가 발생한 데이터를 알아야합니다.

또한 응용 프로그램의 기본 로깅 수준을 정의하는 변수를 사용하는 것이 유용하다는 것을 알았습니다. 그렇게하면 경고 및 오류 코드와 함께 DEBUG 및 INFO 코드를 가질 수 있습니다. 프로덕션 모드에서 실행하면 기본적으로 DEBUG 정보가 출력되지 않지만 버그가 표시되면 플래그를 업데이트하고 DEBUG 메시지를 로그에 쓸 수 있습니다.


1

로깅은 대부분 크로스 커팅 문제입니다. Java만으로는 실제 비즈니스 로직에서 로깅을 분리 할 수있을 정도로 표현력이 충분하지 않습니다. 즉, 예를 들어 한 방법을 사용하여 다른 프로젝트에 넣을 수는 없지만 모든 로깅을 제거하고 조정해야합니다. 그리고 그것은 빙산의 일각에 불과합니다.

로깅 및 "실제"비즈니스 로직을 통합 할 때 해당 문제 및 기타 문제를 방지하려면 측면 지향 프로그래밍 사용을 고려해야합니다. Java의 경우 가장 많이 사용되는 프레임 워크는 AspectJ입니다. 구글 테크 토크의 YouTube 비디오 는 AspectJ와 로깅을 넘어서는 사용법을 설명합니다. 물론 stackexchange에서 자신을 로깅하는 많은 예제를 찾을 수 있습니다 .


0

내가 제안하는 한 가지 사항은 특정 로그 파일과 관련된 여러 로깅 컨텍스트를 가질 수있는 수단이 있으며 코드가 로깅 컨텍스트에 내용을 버릴 것을 명시 적으로 요청 하지 않는 한 모든 로깅 컨텍스트에 기록 된 내용이 기록되도록 정렬하는 것입니다 . 이러한 설계를 통해 작업 중에 자세한 로그를 캡처하고 작업이 성공하면 버릴 수 있지만 작업이 실패하면 로그를 사용할 수 있습니다. 이러한 로깅 기능이 없으면, 오류가 발생했을 때 사용 가능한 로그가 양호하면 응용 프로그램이 모든 기능이 작동하는 99.99 %의 시간에 쓸모없는 데이터를 로깅하는 데 많은 시간을 낭비해야 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.