2013-03-25 3 views
9

JRE 1.7을 실행중인 다른 컴퓨터에 응용 프로그램을 배포 할 때 충돌하는 응용 프로그램에 문제가 있습니다. 내 PC에서 NetBeans 내부 (또는 JAR 파일에서 직접)를 실행하면 모든 것이 잘됩니다. 그러나 다른 컴퓨터에서는 실행 중 특정 이벤트 (단추 클릭)에서 실패합니다.Log4j - 로그 파일을 찾을 수 없습니다.

그래서 log4j 라이브러리를 사용하여 로깅하는 방법을 배웠습니다. 이것은 내 응용 프로그램의 문제에 대한 정보를 주었고 로깅은 내 컴퓨터에서 완벽하게 작동합니다. 그러나 JAR 파일 (Java 7 Update 17) 만 실행중인 다른 컴퓨터에 JAR 파일을 배포하면 로그 파일의 흔적을 찾을 수 없습니다. 내 컴퓨터에서

# Root logger option 
log4j.rootLogger=INFO, file, stdout 

# Direct log messages to a log file log4j.appender.file=org.apache.log4j.RollingFileAppender 
log4j.appender.file.File=C:\logging.log 
log4j.appender.file.MaxFileSize=1MB 
log4j.appender.file.MaxBackupIndex=1 
log4j.appender.file.layout=org.apache.log4j.PatternLayout 
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} 
%-5p %c{1}:%L - %m%n 

# Direct log messages to stdout log4j.appender.stdout=org.apache.log4j.ConsoleAppender 
log4j.appender.stdout.Target=System.out 
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout 
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} 
%-5p %c{1}:%L - %m%n 

, 내가 바로 프로젝트 폴더 내부의 logging.log 파일을 볼 수 있습니다

여기 내 log4j.properties 파일입니다. 그 정도로 모든 것이 완벽하게 작동합니다. 그러나 사용자 PC에는이 파일에 대한 서명이 전혀 없습니다. C : \ Program Files (x86) \ 또는 그 밖의 다른 곳에서는 C : \가 아닙니다. 하드 디스크를 완전히 검색했지만 아무 것도 돌아 오지 않습니다.

어디에서이 파일을 저장해야합니까? 내 속성이 올바르게 설정 되었습니까? 매우 혼란 스럽습니다 ...

고마워요!

+3

대상 컴퓨터의 사용자가 C 드라이브의 루트 디렉터리에 파일을 만들 수 있습니까? – DwB

+2

시작하려면 속성 파일의 백 슬래시를 두 배로 만들어야합니다 :'C : \\ logging.log'. 아니면, 슬래시를 사용하십시오.'C :/logging.log' – Kenster

+0

DwB - 예, c : \에 대한 모든 권한을가집니다. 이것이 사용 권한 문제라고 생각하지 않습니다. – Alex

답변

6

누구든지이 게시물에 걸림돌이 생길 경우 어떻게 해결했는지 문서화하고 싶습니다.

우선 DwB가 정확하게 지적했듯이 문제는 실제로 사용자의 계정에 logging.log 파일을 만들 충분한 권한이 없음을 나타냅니다. 내 코드에는 파일 쓰기 오류가 발생했을 때 시스템을 종료하는 코드가 포함 된 catch 블록이있었습니다. 로깅 세부 사항이 정확하게 작성했기 때문에 필자는이 문제에 대한 정보를 얻지 못했습니다.

일단이 사실을 알게되면 로그 파일을 작성하는 부분을 변경해야합니다. jar 파일 (C : \ Program Files \)이있는 폴더 (C : \) 또는 사용자가 완전한 권한을 가질 수 있다고 보장 할 수없는 곳의 폴더에 쓰기보다는 AppData 경로에 폴더를 만듭니다.

private static void makeAppDataFolder() { 
    File dir = new File(System.getenv("APPDATA") + "\\MyProgram"); 
    if (!dir.exists()) {dir.mkdir();} 
} 

이것은 \의 AppData \ 로밍에서 사용자의 계정에 MyProgram라는 폴더를 만듭니다

내 프로그램의 첫 번째 라인은 지금 (일반 이름 MyProgram 사용) 함수를 호출합니다. 이 경로는 사용자 계정 경로의 일부이므로 사용자가 항상 쓰기 권한을 가지고 문제를 해결할 수 있다고 생각합니다. 다른 사람이 알고 있으면 알려주세요.

그런 다음 내 log4j.properties 파일에, 나는이 내가 방금 만든 폴더에 파일을 지시

log4j.appender.file.File=${user.home}/Application Data/MyProgram/logging.log 

에 선

log4j.appender.file.File=logging.log 

을 변경합니다.

일단 내가이 작업을 수행하고 잘 배치 된 로깅 메시지를 추가하면 다른 문제를 발견 할 수 있었지만 이제는 모든 것이 잘 작동합니다.

누군가가 도움이되기를 바랍니다. 누구든지 제안 사항이 있으면 게시하십시오.

관련 문제