나는 여러 개별 프로그램의 컨테이너 역할을하는 응용 프로그램을 유지 관리합니다. 이러한 프로그램에는 전용 로그 기능이 있습니다. 즉, 로그하는 모든 것을 특수 로그 파일에 저장합니다.java에서 System.out에 대한 액세스 권한 제거
그럼에도 불구하고, 응용 프로그램 개발자는 System.out.println
을 던져 사랑에 보인다 및 e.printStackTrace
컨테이너를 실행할 때이 불가능 깨끗한 콘솔을 유지하고, 모든 것을 호출합니다.
이러한 응용 프로그램이 System.out
및 System.err
을 오염시키는 것을 어떻게 막을 수 있습니까?
구현 노트 :
- 응용 프로그램 로깅의 log4j를 사용;
- 컨테이너는 로깅을 위해 콘솔도 사용하지만, 수명주기 이벤트 및 문제를 위해 엄격하게 예약되어 있으므로 콘솔이 필요합니다.
- 응용 프로그램은 사용자 정의 클래스 로더를 사용하여로드되지만 보안 검사는 적용되지 않습니다.
업데이트 :
단순히 모든 출력을 리디렉션, 그래서 이런 일이 실패 이후 System.out
작동하지 않을 리디렉션이 성공해야
System.setOut(new PrintStream(new OutputStream() {
@Override
public void write(int b) {
throw new Error("Not on my watch you don't");
}
}));
Logger logger = Logger.getLogger(Runner.class);
logger.info("My log message");
.
업데이트 2 :
응용 프로그램이 Log4j의 시스템 클래스 로더에서로드
App app = new UrlClassLoader(...).loadClass(className)).newInstance();
app.setLogger(loggerForClass(app));
에 유사한 코드를 사용하여로드 및 구성됩니다.
이것은 실제 답변이 아니지만 개발자가 로그 파일을 조사하는 것이 아니라 콘솔을 확인하는 것이 더 쉽기 때문에이 작업을 수행하는 경향이 있습니다. 그래서 체크인 할 때, 먼저 찾기/바꾸기 :'System.out' 검색 ('log.debug()'),'System.err' 검색 ('log.info()'),'printStackTrace' (delete)를 검색하십시오. 심지어 svn이 자동화 될 수도 있다고 생각합니다 (확실하지는 않지만 어떻게 할 수 있을지 생각합니다) – laura
시스템 언어에서 관용구는'fork()'될 자식 프로세스의 stdout과 stderr를 리디렉션합니다. 그리고'exec()'를 사용하지만 자바 클래스 로더가 무엇인지 잘 모르겠습니다. 애플리케이션을 로딩하는 방법에 대해 더 자세히 설명해 주시겠습니까? – thirtyseven
컨테이너가 log4j를 사용 중이거나 콘솔에 직접 인쇄 중입니까? – Fedearne