2008-09-17 5 views
13

log4j에 동일한 구성 정보를 사용해야하는 동시에 실행되는 여러 작업이 있습니다. 그들은 모두 동일한 appender를 사용하여 로그를 하나의 파일로 덤핑합니다. 각각의 작업에 로그 파일의 이름을 동적으로 지정하여 별도로 유지할 수있는 방법이 있습니까?log4j 로그 파일 이름?

감사

답변

21

는 각 작업에 대한 Java 시스템 등록 정보를 전달할 수 있습니까? 그렇다면,이 같은 매개 변수화 할 수 있습니다 : 당신의 log4j.properties에서

java -Dmy_var=somevalue my.job.Classname 

그리고 다음을 :

log4j.appender.A.File=${my_var}/A.log 

호스트 환경의 값으로 자바 시스템 속성을 채울 수있다 (예를 들어) 그 작업의 인스턴스를 고유하게 식별합니다.

0

당신이 작업을 초기화 할 때 당신은 프로그램의 log4j를 구성 할 수 있습니다.

런타임시 시스템 등록 정보를 통해 log4j.properties 파일을 설정할 수도 있습니다. log4j.configuration 시스템 프로퍼티의 값에 리소스 문자열 변수를 설정

다음 manual에서. 기본 초기화 파일을 지정하는 기본 방법은 log4j.configuration 시스템 특성을 사용하는 것입니다. 시스템 등록 정보 log4j.configuration이 정의되지 않은 경우, 문자열 variable 자원을 기본값 "log4j.properties"로 설정하십시오.

다른 java 명령에서 작업을 실행한다고 가정하면, 다른 log4j.properties 파일과 각기 다른 파일 이름을 사용할 수 있습니다.

작업이 어떻게 실행되는지에 대한 구체적인 지식이 없으면 말할 수 없습니다!

0

톰 각 작업에 대해 지정하고 추가자를 지정하십시오. 두 개의 서로 다른 자바 패키지 com.tom.firstbatch 및 com.tom.secondbatch에 해당하는이 개 직업을 가지고의하자, 당신의 log4j.xml이 뭔가를 할 것이다 :

<category name="com.tom.firstbatch"> 
     <appender-ref ref="FIRST_APPENDER"/> 
    </category> 
    <category name="com.tom.secondtbatch"> 
     <appender-ref ref="SECOND_APPENDER"/> 
    </category> 
3

을 작업 이름이 미리 알려진 경우 getLogger() 호출을 수행 할 때 작업 이름을 포함시킬 수 있습니다. 그런 다음 개별 appenders를 별도의 파일 이름 (또는 다른 대상)으로 서로 다른 로거에 바인딩 할 수 있습니다.

당신이 사전에 작업 이름을 알 수없는 경우, 당신은 런타임에 로거를 구성하는 대신 구성 파일을 사용하여 수 :

FileAppender appender = new FileAppender(); 
appender.setFileName(...); 
appender.setLayout(...); 
Logger logger = Logger.getLogger("com.company.job."+jobName); 
logger.addAppender(appender); 
1

당신은 아마도 [File.createTempFile (http://java.sun.com/j2se/1.5.0/docs/api/java/io/File.html#createTempFile(java.lang.String,%20java.lang.String)) 방법을 사용하여 자신의 파일 이름을 구성하는 자신의 펜더를 작성할 수 있습니다. FileAppender 클래스가 올바르게 기록 된 경우 — 또는 RollingFileAppender — 및 재정의 그것을 확장 할 수 있어야한다 getFile 메서드를 사용하면 추가 할 새 속성을 기반으로 선택한 값을 반환 할 수 있습니다.

2

각 작업에서 NDC 또는 MDC를 설정 한 다음 NDC 또는 MDC 값에 따라 이름이 다른 appender를 작성할 수 있습니다. 새 appender 작성은 너무 어렵지 않습니다. log4j 샌드 박스에 청구서를 저장할 appender가있을 수도 있습니다.당신은 다음과 같은 구현할 수 http://svn.apache.org/viewvc/logging/log4j/trunk/contribs/

0

을보고 시작

  • ThreadLocal을 홀더를 작업의 정체성.
  • FileAppender를 확장하면 FileAppender는 모든 작업 ID에 대해 QuietWriter가있는지도를 유지해야합니다. SubAppend 메서드에서 ThreadLocal에서 작업의 ID를 얻으면 QuietWriter를 조회하고 (작성하여) 다음과 같이 쓸 수 있습니다.

원하는 경우 메일로 보낼 수 있습니다.

3

우리 시스템에는 비슷한 것을 구현했습니다. 특정 로거를 HashMap에 저장하고 필요에 따라 각각의 로거를 초기화합니다. 여기

은 예입니다 :

이 각 작업에 대해 하나 개의 로그 파일을 만듭니다 : 다음

public class JobLogger { 
private static Hashtable<String, Logger> m_loggers = new Hashtable<String, Logger>(); 
private static String m_filename = "..."; // Root log directory 

public static synchronized void logMessage(String jobName, String message) 
{ 
    Logger l = getJobLogger(jobName); 
    l.info(message); 
} 

public static synchronized void logException(String jobName, Exception e) 
{ 
    Logger l = getJobLogger(partner); 
    l.info(e.getMessage(), e); 
} 

private static synchronized Logger getJobLogger(String jobName) 
{ 
    Logger logger = m_loggers.get(jobName); 
    if (logger == null) { 
     Layout layout = new PatternLayout("..."); 
     logger = Logger.getLogger(jobName); 
     m_loggers.put(jobName, logger); 
     logger.setLevel(Level.INFO); 
     try { 
      File file = new File(m_filename); 
      file.mkdirs(); 
      file = new File(m_filename + jobName + ".log"); 
      FileAppender appender = new FileAppender(layout, file.getAbsolutePath(), false); 
      logger.removeAllAppenders(); 
      logger.addAppender(appender); 
    } 
     catch (Exception e) 
    { ... } 
    } 
    return logger; 
} 
} 

방금과 같은 한 줄의 항목을 사용해야 할 작업이를 사용하는 이름을 지정하고 지정한 디렉토리에서 해당 작업 이름으로 자체 파일에 놓으십시오.

다른 유형의 애펜더 등으로도 조작 할 수 있습니다. JVM이 다시 시작될 때까지 계속 추가됩니다. 작성한대로 항상 서버에 동일한 작업을 실행하면 작동하지 않을 수 있지만 일반적인 생각을 제공합니다. 어떻게 작동 할 수 있는지.

0

log4j.logger.com.foo.admin = AdminFileAppender log4j.logger.com.foo.report = ReportFileAppender

그것은이 작업을 수행하는 또 다른 방법입니다 .. 여기 com.foo.admin 인 전체 패키지 이름

1

빌딩 shadit 님의 답변 클래스의 기본 메소드가 시작된 각 작업을 식별 할 수있는 경우 시스템 등록 정보 sun.java.command을 사용하여 클래스의 전체 이름을 시작할 수 있습니다. 이 같은 예를 들어 :

log4j.appender.LOGFILE.File=${sun.java.command}.log 

나는이 같은 TimestampFileAppender와 함께 사용 :

log4j.appender.LOGFILE=TimestampFileAppender 
log4j.appender.LOGFILE.TimestampPattern=yyyy_MM_dd__HH_mm 
log4j.appender.LOGFILE.File=${sun.java.command}_{timestamp}.log 

이클립스에서 개발하고 있어요 때마다 새로운 프로세스에 대한 새 로그 파일을 얻을이 방법이 I main 메소드와 시작된 시간을 가진 클래스의 클래스 이름으로 식별됩니다.

관련 문제