2012-12-19 7 views
3

로깅 프레임 워크로 logback을 사용하고 다른 매개 변수로 동일한 main 기능을 실행하는 두 개의 작업이 있고 각 작업에 대한 로그 파일을 만들고 작업의 이름으로 로그 파일의 이름을 지정하려고합니다.dyamic 이름 로그 파일을 java에 저장하는 방법이 있습니까?

예를 들어 a,b,c의 작업이 있는데 모두 다른 매개 변수를 사용하여 MyClass.main()을 실행하면 a-{date}.log, b-{date}.log, c-{date}.log을보고 싶습니다.

나는 나의 logback.xml<fileNamePattern>myjob-%d{yyyy-MM-dd}.log</fileNamePattern>을 지정하여 {date} 부분을 달성 할 수있다,하지만 난 모르겠어요 방법 (또는 심지어 가능한 경우) 동적 (작업의 이름으로) 파일 이름의 접두사를 만들 수 있습니다.

logback에서 동적으로 로그 파일의 이름을 지정하는 방법이 있습니까? 이것을 가능하게하는 또 다른 로깅 프레임 워크가 있습니까?

후속 질문으로, 다른 매개 변수와 동일한 main 함수를 호출하고 각 작업 후에 이름이 지정된 로그 파일을 원한다고 여러 작업을 수행하는 것은 좋지 않은 접근 방법입니까? 그렇다면이 사례에 대한 표준/모범 사례 솔루션이 있습니까?

EDIT : 작업 이름 뒤에 각 로그 파일의 이름을 지정하려는 이유는 각 작업이 자연스럽게 "작업 단위"를 정의하고 적절한 로그 파일을 찾는 것이 더 쉽습니다. 작업이 실패합니다. 나는 단순히 작업을위한 롤링 로그 파일을 사용할 수 있습니다. a,b,c하지만 로그를 살펴보고 각 작업이 시작되고 종료 된 위치를 정확히 찾아내는 것이 더 어려워졌습니다.

답변

1

logback에서 로그 파일의 이름을 동적으로 지정하는 방법이 있습니까? 이것을 가능하게하는 또 다른 로깅 프레임 워크가 있습니까?

나는이 표준 logback.xml 파일에 의해 구성된 out of the box 펜더 (File, RollingFile 등)를 사용하여 가능하다 생각하지 않습니다. 원하는 것을 수행하려면 동적으로 appenders를 생성하고 로거를 다른 appender에 할당해야합니다. 또는 로거 이름을 기반으로 동시에 여러 파일에 쓸 수있을만큼 스마트 한 새로운 appender를 만들어야합니다.

난 그냥 다른 매개 변수 및 각 작업의 이름을 따서 명명 로그 파일을 원하는과 같은 주요 기능을 호출 여러 작업을 필요에 대한 잘못된 접근 방식을 가지고 있는가?

logback 주소이 문제의 저자와 Mapped Diagnostic Context

취할 수 있지만 다소 좌절 접근 섹션 slightly discourage 그것으로부터 다른 클라이언트의 기록 출력이 새로운 별도의 인스턴스로 구성 차별화 각 클라이언트에 대한 로거. 이 기술은 로거의 확산을 촉진하고 관리 오버 헤드를 증가시킬 수 있습니다. ... 더 가벼운 기술은 주어진 클라이언트를 서비스하는 각 로그 요청을 고유하게 스탬핑하는 것으로 구성됩니다.

그런 다음이 문제의 해결 방법으로 매핑 된 진단 컨텍스트에 대해 설명합니다. 여러 스레드에서 동시에 여러 클라이언트에 대해 숫자를 처리하는 NumberCruncherServer의 예를 보여줍니다. 매핑 된 진단 컨텍스트와 적절한 로깅 패턴을 설정하면 어떤 로그 이벤트가 어떤 클라이언트에서 발생했는지를 쉽게 판별 할 수 있습니다. 그런 다음 grep 도구를 사용하여 상세한 로깅 이벤트를 별도의 파일로 분리하면됩니다.

2

로깅을 사용하고 싶습니다.

public static PrintWriter getLogerFor(String prefix) { 
    SimpleDatFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); 
    String filename= prefix + sdf.format(new Date()); 
    return new PrintWriter(filename, true); // auto flush. 
} 

예를 들어 간단한 LRU 캐시를 작성할 수 있습니다. LinkedHashMap을 사용하여 PrintWriters를 다시 사용하십시오.

0

예. 가능합니다.

먼저 로거와 애펜더의 두 가지 개념에 자신을 익숙하게해야합니다. 일반적으로, 코드는 Logger를 획득하고 debug(), warn(), info() 등의 로깅 메소드를 호출합니다. Logger에는 Appender가 연결되어 있으며 Appender는 다음으로 설정된 구성에 따라 사용자에게 로깅 정보를 제공합니다. 그것.

일단 익숙해지면 각기 다른 작업 유형에 대해 다른 파일 이름으로 FileAppender를 동적으로 만들고 Logger에 첨부해야합니다.

위의 내용 중 어느 것도 의미가 없으면 Logback Manual을 사용하는 것이 좋습니다.

0

<FileNamePattern> 태그에서 판별 기호 키를 사용할 수 있으므로 로그백 판별 기호를 사용할 수 있습니다.

옵션 1 : 나는 두 가지 옵션을 생각할 수

당신은, 당신이 사용하는 각 작업에서 서로 다른 값을 설정해야합니다 로깅 분리를 구현하기 위해 Mapped Diagnostic Context 판별을 사용할 수 있습니다 MDC.put();

당신은 logback 구성에 대한 당신의 펜더 같은 것을 볼 것이라는 점을 수행하면 :

<appender name="SIFT" class="ch.qos.logback.classic.sift.SiftingAppender"> 
    <discriminator class="ch.qos.logback.classic.sift.MDCBasedDiscriminator"> 
     <key>jobName</key> <!-- the key you used with MDC.put() --> 
     <defaultValue>none</defaultValue> 
    </discriminator> 
    <sift> 
     <appender name="jobsLogs-${jobName}" class="ch.qos.logback.core.rolling.RollingFileAppender"> 
      <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> 
       <FileNamePattern>${jobName}.%d{dd-MM-yyyy}.log.zip</FileNamePattern> 
       . 
       . 
       . 
      </rollingPolicy> 
      <layout class="ch.qos.logback.classic.PatternLayout"> 
       <Pattern>...</Pattern> 
      </layout> 
     </appender> 
    </sift> 
</appender> 

옵션 2 :

스레드 이름을 기준으로 구분하기 위해 사용자 고유의 디스크 리미터 - 구현 ch.qos.logback.core.sift.Discriminator -을 구현합니다.

public class ThreadNameDiscriminator implements Discriminator<ILoggingEvent> { 

    private final String THREAD_NAME_KEY = "threadName"; 

    @Override 
    public String getDiscriminatingValue(ILoggingEvent event) { 
    return Thread.currentThread().getName(); 
    } 

    @Override 
    public String getKey() { 
    return THREAD_NAME_KEY; 
    } 

    // implementation for more methods 
    . 
    . 
    . 
} 

로깅 펜더가 판별 클래스 ThreadNameDiscriminator 인과 키가 threadName 인과 옵션처럼 보일 것이다 : 같이 보일 것입니다. 이 옵션에서는 작업에서 MDC 값을 설정할 필요가 없으므로 MDC에 대한 수정이 필요하지 않습니다.

관련 문제