이것은 약간 이상하지만, 로깅 패키지 및 속성 사용에 익숙하지 않습니다. 인터넷 검색으로 찾을 수있는 모든 질문은 "로깅을 여러 파일을 여는 방법"입니다. 하지만 오늘 내 질문은 그것을 만드는 방법입니다 여러 파일을 동시에하고 중지하십시오. 여기에 우리가 간다 ...Java 로그 오프닝 "too many"로그 파일
첫 번째 사항 :이 프로젝트는 java.util.logging을 사용하여 제한되며, 아니요 log4j 또는 다른 타사 패키지로 전환 할 수 없습니다. 그렇습니다. 더 굉장해.
import java.util.logging.Logger;
import java.util.logging.LogManager;
// in startup routine:
LogManager.getLogManager().readConfiguration(
this.getClass().getResourceAsStream("/logging.properties"));
작동하는 그들을 속성은 JAR에서 파일을 꺼내와 적용이 애플릿이 시작되면 :-)
그래서, 그것은 코드의이 비트를 실행합니다. readConfiguration()
은 VM 시작에서 모든 기존 설정을 다시 설정해야합니다. 프로젝트의 나머지 부분은
private final static Logger LOGGER = Logger.getLogger(NameOfClass.class.getName());
과 같은 라인을 가지고 있습니다. 나는 꽤 표준이라고 생각합니다. 모든 클래스는 동일한 패키지 (예 : TheProject)에 있고, 펑키 로깅 이름/속성 계층 구조는 java.util.logging이 롤백하는 것을 좋아하기 때문에 동일한 규칙을 따릅니다.
logging.properties 파일은 Java 6 SE JRE와 함께 제공된 파일의 복사본으로 시작한 다음 수정되었습니다. 이제 다음과 같이 보입니다 :
handlers=java.util.logging.FileHandler,java.util.logging.ConsoleHandler
# Default global logging level.
.level=INFO
# Loggers
# ------------------------------------------
# Loggers are usually attached to packages.
# Here, the level for each package is specified.
# The global level is used by default, so levels
# specified here simply act as an override.
java.level = INFO
javax.swing.level = INFO
sun.awt.level = INFO
theproject.level = ALL
# Handlers
# -----------------------------------------
theproject.handlers=java.util.logging.FileHandler
# Override of global logging level
java.util.logging.FileHandler.level=ALL
# Naming style for the output file:
java.util.logging.FileHandler.pattern=/path/to/logfiles/TheProject%u.%g.log
로그 메시지가 Java 콘솔에 표시되고 디스크 파일에도 표시된다는 점에서 모두 "작동"합니다. 애플릿이 실행 되 자마자 두 개의 파일이 동시에 열립니다 (TheProject0.0.log 및 TheProject1.0.log). 로그 메시지가 시작되면 두 파일에 동시에 표시됩니다. 두 파일 모두 최대 크기에 도달했을 때를 포함하여 항상 서로의 정확한 사본입니다 (모두!).
한 번에 하나의 JRE VM 만 실행 중입니다.
언제든지 두 파일 중 하나를 열거 나 두 파일을 모두 닫은 다음 확인했습니다. 하나가 다른 것보다 더 오랜 시간이나 더 짧은 시간 동안 열려있는 것과는 다릅니다.
두 파일 이름 사이에 다른 % u 토큰은 로그 파일이 이미 다른 프로세스에서 열려있는 경우 "충돌을 해결할 고유 번호"로 문서화되어 있지만 은으로 생각합니다. 두 로그 동일한 데이터를 가져오고 있으며 다른 어떤 것도 파일을 열지 않습니다. (증거 : Windows는 VM이 실행 중일 때 두 파일을 삭제할 수 없지만 일단 VM이 종료되면 VM이 종료됩니다.)
속성 파일에서 무언가를하고 있거나 속성을 올바르게로드하는 방법을 잘못 이해하고 있습니까? , 또는 ...?
'theproject.handlers = ... '를 주석 처리 해 보셨습니까? –
게시 한 내용에 문제가없는 것 같습니다. LogManager.getLogManager(). getLogger (NameOfClass.class.getName()). javaHandler (new FileHandler ("/ path/to /logfiles/TheProject%u.%g.log "));'). 그것이 내가 그것을 재현 할 수있는 유일한 방법이었습니다. –