문제

우리는 여러 작업이 동시에 실행하는 사용하는 동일한 구성에 대한 정보 log4j.그들은 모두를 덤프하는 로그에 하나의 파일로 사용하여 동일 추가.는 방법이 있을 각 작업 동적으로 이름의 로그 파일 그래서 그들은 별도?

감사

도움이 되었습니까?

해결책

를 전달할 수 있는 Java 시스템 등 각 작업에 대한?그렇다면,매개 변수화할 수 있습니다 다음과 같다:

java -Dmy_var=somevalue my.job.Classname

다음에 log4j.속성:

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

를 채울 수 있습 Java 시스템 등록 정보 값으로 호스트에서 환경(예를 들어)는 것을 고유하게 식별하의 인스턴스는 작업입니다.

다른 팁

는 작업의 경우 이름이 알려진 시간에 앞서 포함할 수 있습니다 작업을 이름을 할 때 getLogger()호출합니다.당신은 다음을 묶을 수 있습니다 다른 appenders 다른 로거,별도의 파일 이름(또는 다른 목적지).

할 수 없는 경우 일을 알고 이름을 앞의 시간을 구성할 수 있습 로 런타임 시에 사용하는 대신 configuration file:

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

우리는 우리와 비슷한 구현에서 우리의 시스템입니다.우리는 저장 특정거장에 HashMap 초기화 appenders 에 대한 그들 각각으로 필요합니다.

예를 들어 다음과 같습니다.

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;
}
}

다음 사용하이 당신의 일에서 당신만을 사용해야 한 줄에 항목은 다음과 같습니다:

JobLogger.logMessage(jobName, logMessage);

이것이 하나를 만들에 대한 로그 파일 이름을 각 작업에 그것의 자신의 파일과 함께하는 작업을 이름에서 어떤 디렉토리를 지정합니다.

바이올린 수 있는 다른 유형의 appenders 한,서면으로 그것이 계속됩니다 추가될 때까지 JVM 을 다시 시작하는 작동하지 않을 수 있습니다 실행하는 경우 동일한 작업을 하는 서버에서는 항상,그러나 이것은 일반의 아이디어는 어떻게 작업할 수 있습니다.

할 수 있는 각 작업이 설정 NDC 또는 MDC 다음 쓰기에 추가하는 변화를 기반으로 이름을 NDC 또는 MDC 값입니다.새로 만들어 추가 너무 어려운 일이 아니다.있을 수도 있습니다 추가하는 법안을 맞에 log4j 스가 될 수 있습니다.시작 보고서 http://svn.apache.org/viewvc/logging/log4j/trunk/contribs/

당신이 쓸 수 있는 자신의 펜더를 만드는 자신의 파일 이름,아마도를 사용하는[파일입니다.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 방법 중 하나를 반환하는 선택에 따라 어떤 새로운 특성을 같은 추가 할 수 있습니다.

에 건물 shadit's answer.을 경우 각각의 작업으로 식별할 수 있습는 클래스의 기본 방법 시작한 사용할 수 있는 시스템 제공 sun.java.command 는 contais 전체 클래스 이름을 시작했다.예를 들어 다음과 같다:

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

이 방법을 때 나는 개발에 이클립스 나는 새로운 로그를 파일에 대한 각각의 새로운 프로세스가 실행을 식별 classname 클래스의 메인 방법과 시간이 시작되었습니다.

톰거워 하네요 당신이 지정하고 appenders 각 작업입니다.자가 있는 2 채용에 해당하는 두 개의 서로 다른 자바 패키지 com.톰.firstbatch 설문 조사를 진행하고 있습니다.톰.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>

할 수 있는 프로그래밍 방식으로 구성 log4j 면 초기화 작업입니다.

을 설정할 수도 있습니다 log4j.properties 파일을 통해 런타임 시스템을 제공합니다.서 설명:

설정한 리소스 문자열 변수의 값이 log4j.구성 시스템을 제공합니다.선호하는 방법을 지정하는 기본 초기화 파일을 통해 log4j.구성 시스템을 제공합니다.는 경우에 시스템을 제공 log4j.구성은 정의하지 않는,다음 설정의 문자열 변수 리소스의 기본값"log4j.등록".

가 실행 중인 작업에서 다른 java 명령,이것은 그들이 사용하는 다른 log4j.properties 파일이 다른 파일 이름에 대한 각각의 하나입니다.

없이의 특정 지식이 어떻게 작업을 실행하기 어려운 말한다!

을 구현할 수 있 다음과 같다:

  • A ThreadLocal 홀더에 대한 정체성의 작업입니다.
  • 확장 FileAppender,당신의 FileAppender 을 유지하지도를 들고 QuietWriter 을 위해 모든 작업 정체성입니다.에서 방법 subAppend,당신은 당신의 id 는 귀하의 작업에서 ThreadLocal,당신은(또는 생성)QuietWriter 및 쓰기를...

내가 당신을 보낼 수 있지만 일부 코드를 우편으로 원하는 경우...

log4j.로거.com.foo.admin=,AdminFileAppender log4j.로거.com.foo.보고서=,ReportFileAppender

그것은 또 다른 방법으로 이 작업을 수행하..여기 com.foo.관리자가 전체 패키지 이름

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top