2012-01-06 3 views
4

프로덕션 서버 아래에 웹 응용 프로그램을 배포 할 예정입니다. 프로덕션 환경의 catch 블록에서 printStackTrace를 포함 할 수 있습니까? (catch 블록 아래의 로그가 오류의 정확한 원인을 알 수 없기 때문에) catch 블록 아래에서 printStackTrace를 사용하는 것이 적절한 지 알려주시겠습니까?java : 프로덕션 환경에서 printStackTrace 사용

예를 들어 잘못된 포트 번호를 지정하면 printStackTrace()가이 정보를 제공합니다.

의 printStackTrace() :

java.lang.IllegalArgumentException: port out of range:80800 
     at java.net.InetSocketAddress.<init>(InetSocketAddress.java:118) 
     at sun.net.NetworkClient.doConnect(NetworkClient.java:163) 
     at sun.net.www.http.HttpClient.openServer(HttpClient.java:395) 
     at sun.net.www.http.HttpClient.openServer(HttpClient.java:530) 
     at sun.net.www.http.HttpClient.<init>(HttpClient.java:234) 
     at sun.net.www.http.HttpClient.New(HttpClient.java:307) 
     at sun.net.www.http.HttpClient.New(HttpClient.java:324) 
     at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:970) 
     at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:911) 
     at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:836) 
     at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:1014) 
     at com.tata.util.XmlClient.execute(HttpXmlClient.java:83) 

로그 스타일 :

어디 로그이 (로깅 내가 사용하고 아파치 평민 로깅 메커니즘)

Log.write("**EXCEPTION INSIDE execute " + e, Log.INFO); 

06/Jan/2012 16:25:55 - main:http-8080-2 <> <60990020>**EXCEPTION INSIDE execute java.lang.IllegalArgumentException: port out of range:80800 
을 제공으로

catch 블록 아래에서 printStackTrace를 사용할 수 있는지 알려주시겠습니까?

답변

6

로그에 스택 추적도 표시되지만 correctlly를 사용하지는 않습니다. 보십시오 : 당신이 Log.write("**EXCEPTION INSIDE execute " + e, Log.INFO);을 수행 할 때 문자열 연결 연산자로 사용되는 더하기 기호는 사실에 예외 오브젝트에 도착 결코 변화를 받고되지는 "**EXCEPTION INSIDE execute " String으로 그 전자 개체의 toString() 메소드를 호출하고, 추가합니다

log.error(Object message, Throwable t); 

또는 스택 추적입니다.

http://commons.apache.org/logging/guide.html#Logging 당신의 인생 응용 프로그램의 스택 트레이스를 갖는 메시지

+0

감사합니다. 그래서이 코드에서이 방법으로 사용해야합니까 ?? catch (Exception e) {log.error (Object message, Throwable e)}; – Kiran

+0

네, 그런 식으로 사용하십시오. 괜찮을 것입니다.로그에서 어떻게 보이는지 확인하고 필요한 사항을 확인하십시오. Log4j 설정을 사용하여 로그 메시지의 형식을 변경할 수 있습니다. http://www.allapplabs.com/log4j/log4j_layouts.htm –

1

확실히 나쁘다.

printStackTrace에 대한 팝업을 만들어 특정 디버그 플래그가 활성화되어있는 경우 표시하지 않는 이유는 무엇입니까 (java에서 어떻게 수행되는지는 확실하지 않음).

일반적으로 모든 예외는 처리해야하는 곳에 거품을 띄게합니다. 연결 오류는 앱에 표시하려는 정보 일 수 있으므로 프런트 엔드 (예 : 팝업)에서 처리해야합니다.

Andrei Bodnarescu가 맞습니다. 로거를 수정하면 트릭을 수행 할 수 있습니다.

+0

프로덕션 응용 프로그램의 로그에있는 스택 추적이 다음과 같은 이유에 대해 설명해 주시겠습니까? 나쁜? 나는 그렇지 않다는 것을 믿고 특별히, 당신은 dev 환경에 특정 버그를 재현 할 수 없을 수도 있으며, 따라서 왜 일어나고 있는지 가장 작은 아이디어없이 생산 상자에 bizzare 예외가 붙어있을 수 있습니다. –

+0

스택 추적은 사용자가 응용 프로그램의 내부 동작을 표시하고 보안 위험을 초래할 수 있으므로 사용자가 볼 수 없어야합니다. 물론 예외를 잃어 버리는 것을 허용 할 수 없습니다. 하지만이를 사용자에게 표시하고 사용자가 그 작업을 결정할 수 있도록 남겨두기보다는 내부적으로 처리하고 파일에 기록하거나 또는 예외적 인 전자 메일을 보낼 수도 있습니다. 개발자가 정기적으로 확인하는 예외 전자 메일 상자 – Pete

0

글쎄, 그런 식으로하는 것이 로깅에 대한 첫 번째 접근이며 확실하게 문제가 나타나면 해결하는 데 도움이 될 것입니다. 하지만 log4j 또는 commons logger와 같은 로깅 라이브러리를 사용하여 응용 프로그램을 설정하고 추가 데이터 (DB 쿼리, 작업 결과 등)를 출력하도록 향상시킬 수 있으므로 스택 트레이스와 함께 몇 가지를 더 잘 검색 할 수 있습니다. 체재.

또한 추적 기능이있는 컨테이너/웹 서버 로그를 사용하면 클라이언트가 의심 스럽지만 구조화 된 응용 프로그램 로그를 사용하면 평온함을 유지할 수 있습니다. 지각의 문제.

0

예, 프로덕션 환경에서 예외에 대한 스택 추적을 인쇄해도됩니다. 원한다면 여전히 처리를 위해 예외를 던질 수 있습니다.

관련 문제