문제
우리는 여러 작업이 동시에 실행하는 사용하는 동일한 구성에 대한 정보 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.관리자가 전체 패키지 이름