2013-05-03 1 views
1

У меня есть веб-приложение, JSP, где я распечатать трассировку стека ошибки следующим образом:флаг отладки для JSP веб-приложения

catch (SQLException e) { 
     e.printStackTrace(System.out); 
    } 

но в производственной среде, я не хочу, чтобы мое приложение, чтобы напечатать что-нибудь. Я хочу поставить глобальный флаг (например, Debug = true). то я буду обновлять такие коды

if(debug) e.printStackTrace(System.out); 

У меня есть много страниц в моем приложении. Теперь, где я должен объявить переменную отладки? Я могу поместить его в файл web.xml, но я не уверен, что его безопасно или нет. Спасибо

+1

У вас нет какого-либо класса, где вы храните глобальные переменные и пути к файлам конфигурации (не таким, как 'web.xml', но напрямую для использования в вашем приложении)? – Dworza

+5

Используйте API регистрации, например slf4j, log4j или java.util.logging. Для этого они нужны. –

ответ

3

Используйте API ведения журнала, например, JB Nizet. Они довольно просты в использовании. Вот небольшой пример для ведения журнала с использованием Log4j от Apache (http://logging.apache.org/log4j), который очень популярен.

Все ваши классы будут иметь экземпляр регистратора готовый

private static final Logger log = Logger.getLogger(this.getClass()); 

Тогда в тех местах, где вы перехватывать исключения

catch (SQLException e) { 
    log.debug(e); 
} 

Затем просто настроить Log4j с помощью log4j.properties в вашем classpath

log4j.appender.stdout.Target=System.out 
log4j.appender.stdout=org.apache.log4j.ConsoleAppender 
log4j.appender.stdout.layout=org.apache.log4j.SimpleLayout 

log4j.rootLogger=debug, stdout 

К включению регистрации затем так же просто, как изменение

log4j.rootLogger=warn, stdout 

Что это означает, что вы заинтересованы только в операторах журнала, которые находятся на уровне предупреждения или выше (например, ошибки, или со смертельным исходом). Существует около шести уровней журнала: фатальный, ошибка, предупреждение, информация, отладка и трассировка. Когда вы устанавливаете уровень, все логические операторы, которые регистрируются на уровне ниже того, что вы указали, игнорируются.

Обратите внимание, что я упростил все выше. Рекомендуется использовать log4j.xml вместо .properties. Последние интерфейсы также позволяют получить некоторое представление с проверкой сделано перед входом

catch (SQLException e) { 
    if (log.isDebugEnabled()) log.debug(e); 
} 

Но, реальный пункт продажи с использованием структуры вместо того, чтобы просто проверяя Globals.DEBUG флаг, прежде чем делать printStackTrace(), что это на будущее. Скажите завтра, если вам нужно записывать вещи в файл, просто переключитесь с ConsoleAppender на FileAppender. Хотите получить электронное письмо на что-то fatal, используйте SMTPAppender только для этого прецедента. Другие appenders остаются настроенными так, как они есть.