문제

나는 응용 프로그램으로 구성된 전반적인 석영-기반으로 스케줄러에"CycledJob"를 사용하여 실행 CronTriggers.응용 프로그램의 목적은 프로세스 입력에서 다른 이메일 수신함에 따라 원본다.

기반으로 하는 국가에서(i.e미국,영국,FR,etc.) 응용 프로그램 중 하나 트리거 작업에 스레드를 실행하는 각 국가의 처리 주기가 될 정도로 영국 Worker thread,하나를 위한 미국,프랑스,등등.할 때 포맷 출력을 log4j,나는 스레드를 사용하여 매개변수,그래서 그것이 방출하는[ApplicationName_Worker-1],[ApplicationName_Worker-2]etc.저는 노력할 수 있는,나를 찾을 수 없는 방법을 이름은 스레드 그들이 뽑아의 석영의 실 수 있습니다.도 있겠지만 아마도 가장의 석영,나는 일하고 싶다고 생각하고 다른 대신 솔루션 덤비는 표준 라이브러리입니다.

여기에 문제가:을 사용할 때 log4j,내가 가지고 싶다면 모든 로그 항목에서 우리에 스레드를 출력하여 우리에만 파일에 대한 마찬가지로 각 국가의 스레드입니다.나는 걱정하지 않는 경우에 숙박을 하나의 통합 ConsoleAppender,the FileAppender 분할은 무엇 난 후에 여기에.나는 이미 알고있는 지정하는 방법을 여러 파일 appenders 과 같은,나의 문제는 나를 구분할 수 없습에 기반한 나라입니다.20+클래스에서 할 수 있는 응용 프로그램에서 실행 체인에 매우 몇 가지는 내가 원하는 부담이 지식을 전달하는 추가"context"를 매개 변수를 통해 모든 메소드...나는 고려는 전략 패턴을 확장하 log4j 래퍼 클래스를,그러나지 않은 한 수 있도록 할 수 있습니다 모든 클래스에서 알고 있는 스레드에 매개 변수화 logger,통화 보이는 불가능합니다.할 수 없이 이름은 스레드 또한 도전을 만들(또는 다른 것이 쉽습니다!).

그래서 여기 질문:어떤 것은 제안된 접근을 허용하는 많은 하위 클래스는 응용 프로그램에서는 각 사용되는 모든 다른 스레드 프로세스 입력 알고 있는 그들은 컨텍스트 내에서 특정 국가의 실 때 그들은?

행운을 이해 문의하시기 바랍 명백하게 하는 질문!난 누군가가 도움을 줄 수 있을 알아내 유명들을 해결하기 위한 방법이다.모든 제안을 환영합니다.

도움이 되었습니까?

해결책

상단에서의 각 국가의 처리는 실을 넣어 국가 코드로 Log4j 의 매핑 진단 컨텍스트(MDC).이용 ThreadLocal 변수는 없는 전달하는 나라와 아래로 호출 스택에 적용됩니다.그때 사용자 정의 필터를 만들에서 보이는 MDC,및 모든 이벤트를 필터링합을 포함하지 않는 현재 추의 국가 코드입니다.

Job:

...
public static final String MDC_COUNTRY = "com.y.foo.Country";
public void execute(JobExecutionContext context)
  /* Just guessing that you have the country in your JobContext. */
  MDC.put(MDC_COUNTRY, context.get(MDC_COUNTRY));
  try {
    /* Perform your job here. */
    ...
  } finally {
    MDC.remove(MDC_COUNTRY);
  }
}
...

작성자 필터:

package com.y.log4j;

import org.apache.log4j.spi.LoggingEvent;

/**
 * This is a general purpose filter. If its "value" property is null, 
 * it requires only that the specified key be set in the MDC. If its 
 * value is not null, it further requires that the value in the MDC 
 * is equal.
 */
public final class ContextFilter extends org.apache.log4j.spi.Filter {

  public int decide(LoggingEvent event) {
    Object ctx = event.getMDC(key);
    if (value == null)
      return (ctx != null) ? NEUTRAL : DENY;
    else
      return value.equals(ctx) ? NEUTRAL : DENY;
  }

  private String key;
  private String value;

  public void setContextKey(String key) { this.key = key; }
  public String getContextKey() { return key; }
  public void setValue(String value) { this.value = value; }
  public String getValue() { return value; }

}

에 log4j.xml:

<appender name="fr" class="org.apache.log4j.FileAppender">
  <param name="file" value="france.log"/>
  ...
  <filter class="com.y.log4j.ContextFilter">
    <param name="key" value="com.y.foo.Country" />
    <param name="value" value="fr" />
  </filter>
</appender> 

다른 팁

나는 조금 더 많은 도움이 이것보다는,하지만 조사할 수 있습니다 일부를 사용하여 필터를?아마도 당신의 로깅할 수 있 출력하는 국가 코드고할 수 있습 필터링 기반으로 하는?

A StringMatchFilter 해야 일치시킬 수 있습니다.

을 얻을 수 없었 아래 주소를 제대로 작동하려면으로 링크,하지만 당신이 그것을 보면,그것은 몇 가지 재료에는 별도의 파일 로깅을 사용하여 필터입니다.

http://mail-archives.apache.org/mod_mbox/logging-log4j-user/200512.mbox/<1CC26C83B6E5AA49A9540FAC8D35158B01E2968E@pune.kaleconsultants.com >(다만 제거하기 전에 공간>)

http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/spi/Filter.html

왜 그냥 부르 스레드가 있습니다.는 즉시 기능이 완료된 후에 파괴()할 때 당신의 작업이 시작되는 시기 이름을 설정하는 실?이 있는 경우에 액세스 문제,구성 석영를 사용하여 자신의 스레드 수영장도 있습니다.

나 수 있습니다 완전히 떨어져 기초에 대한 이해 무엇을 달성 하려고 하지만,나에 자상의 솔루션입니다.그것은 소리처럼 당신이 원하는 별도의 로그 파일에 대한 각 국가는 당신은 전자 메일을 처리.에 기반하여 이해하고,여기에 가능한 솔루션:

  1. 설정에 추가에서 당신의 log4j configuration 에 대한 각 국가를 위해하고자하는 로그에 별도로(US 를 들어 제공):

    log4j.추가.usfile=org.apache.log4j.FileAppender

    log4j.추가.usfile.File=니다.로그인

    log4j.추가.usfile.레이아웃=org.apache.log4j.PatternLayout

    log4j.추가.usfile.레이아웃이 있습니다.ConversionPattern=%m%n

  2. 을 만들 logger 에 대한 각 국가 직접 그들 각각의 적절한 추(우리에게 예제를 제공):

    log4j.로거.내 us-logger=debug,usfile

  3. 에서 당신의 코드를 만들의 로거 기반에 대한 국가는 이메일을 처리:

    로거 logger=Logger.getLogger("내 us-logger");

  4. 을 결정할 것입니다 어떻게 달성에 대해 3 단계 이후의 방법을 호출합니다.을 반복할 수 있 3 단계에서 각 클래스/메소드;거나 수정할 수 있습 방법을 서명을 받아 로거 입력으로;또는 당신은 아마도 사용 ThreadLocal 을 통과하는 Logger 사이에 방법이 있습니다.

추가 정보:당신이 원하지 않는 경우는 로그문가는 부모 로거(예:이 rootLogger),당신은 설정할 수 있습니다 그들의 가산성 깃발을 false(우리에게 예제를 제공):

log4j.additivity.my-us-logger=false
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top