Отключить ведение журнала консоли в приложении Google App Engine

У меня есть приложение, работающее на Google App Engine (GAE) v1.8.2. Я использую java.util.logging. В моих классах регистратор определен как:

частный статический конечный регистратор logger = Logger.getLogger (MyClass.class.getName ());

В моем appengine-web.xml есть следующие строки:

  <!-- Configure java.util.logging -->
  <system-properties>
    <property name="java.util.logging.config.file" value="WEB-INF/logging.properties"/>
  </system-properties>

Файлы logging.properties содержат следующие строки:

# A default java.util.logging configuration.
# (All App Engine logging is through java.util.logging by default).
#
# To use this configuration, copy it into your application's WEB-INF
# folder and add the following to your appengine-web.xml:
# 
# <system-properties>
#   <property name="java.util.logging.config.file" value="WEB-INF/logging.properties"/>
# </system-properties>
# WARNING , INFO, SEVERE, OFF
handlers=java.util.logging.ConsoleHandler
# Set the default logging level for all loggers to WARNING
.level = OFF
java.util.logging.ConsoleHandler.level=OFF
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter

Однако я все еще продолжаю видеть журнал INFO из моего кода в консоли браузера. Как полностью отключить выход из консоли?

Обновление: содержимое моего файла appengine-java-sdk-1.8.2 / config / sdk / logging.properties:

# Logging configuration file for Google App Engine tools.

# Specify the handlers to create in the root logger
# (all loggers are children of the root logger)
# The following creates the console handler
handlers = java.util.logging.ConsoleHandler

# Set the default logging level for the root logger
.level = INFO

# Set the default logging level for the datanucleus loggers
DataNucleus.JDO.level=WARNING
DataNucleus.Persistence.level=WARNING
DataNucleus.Cache.level=WARNING
DataNucleus.MetaData.level=WARNING
DataNucleus.General.level=WARNING
DataNucleus.Utility.level=WARNING
DataNucleus.Transaction.level=WARNING
DataNucleus.Datastore.level=WARNING
DataNucleus.ClassLoading.level=WARNING
DataNucleus.Plugin.level=WARNING
DataNucleus.ValueGeneration.level=WARNING
DataNucleus.Enhancer.level=WARNING
DataNucleus.SchemaTool.level=WARNING

# FinalizableReferenceQueue tries to spin up a thread and fails.  This
# is inconsequential, so don't scare the user.
com.google.common.base.FinalizableReferenceQueue.level=WARNING
com.google.appengine.repackaged.com.google.common.base.FinalizableReferenceQueue.level=WARNING

# We assume that people will generally want to see this message, even
# if they override the root level to WARNING.  If they really want to
# turn it off, they can always override this level as well.
com.google.appengine.tools.development.DevAppServerImpl.level=INFO

Спасибо.


person DFB    schedule 06.08.2013    source источник


Ответы (1)


Вы должны подтвердить, что LogManager использует ваш logging.properties. Простой способ проверить это - изменить ConsoleHandler форматировщик с java.util.logging.SimpleFormatter на java.util.logging.XMLFormatter, а затем посмотреть, является ли ваш результат xml. Если это xml, вы можете попробовать закомментировать строку handlers=. Если вывод по-прежнему с SimpleFormatter, тогда:

  1. Проверьте путь к logging.properties.
  2. Убедитесь, что SecurityManager не препятствует внесению изменений в журнал.
  3. Напишите код для обхода всех регистраторов и вывода имени класса всех подключенных обработчиков. Затем обновите свой logging.properties, чтобы отключить любые другие обработчики, которые могут писать в консоль.
  4. Напишите код для обхода всех регистраторов и отключения всех обработчиков консоли.
  5. System.out.close (); System.err.close ();
  6. новый FileOutputStream (FileDescriptor.out) .close (); новый FileOutputStream (FileDescriptor.err) .close ();
person jmehrens    schedule 06.08.2013
comment
Я все еще вижу вывод SimpleFormatter. Мой файл logging.properties находится в WEB-INF. Как мне проверить № 2, № 3 и № 4? Спасибо за вашу помощь. - person DFB; 06.08.2013
comment
@DFB # 2 System.getSecurityManager (). CheckPermission. # 3 и # 4 Используйте LogManager, чтобы получить все имена регистраторов, затем запросите каждое регистратор по имени. - person jmehrens; 07.08.2013
comment
Какое разрешение мне следует проверить? Я не могу использовать LogManager в GAE. В нем говорится, что LogManager не поддерживается средой выполнения GAE Java. В моем коде есть только информация и журнал предупреждений (logger.info (что-то) и logger.warn (что-то)). Похоже, он вообще не использует мои logging.properties. Еще раз спасибо за вашу помощь. - person DFB; 07.08.2013
comment
Проверьте наличие 'new LoggingPermission (control)'. Я согласен с тем, что, похоже, он вообще этим не пользуется. Заставляет меня склоняться к №1. Должен быть альтернативный способ указать путь. I.E. ./WEB-INF/logging.properties - person jmehrens; 07.08.2013
comment
Я только что заметил, что он переключается на формат XML в консоли Eclipse, но в консоли Chrome он остается в простом формате. - person DFB; 07.08.2013
comment
Я только что обновил сообщение содержимым файла logging.properties по умолчанию appengine. Изменение уровня в этом файле также не влияет на ведение журнала консоли браузера. В моих файлах классов, если я выполняю logger.getLevel (), он возвращает значение null. Но если я сделаю logger.setLevel (Level.OFF), он отключит ведение журнала специально для этого класса (как и ожидалось). Но я пытаюсь найти способ отключить ведение журнала для всех классов в моем приложении. - person DFB; 07.08.2013
comment
Возможно, придется установить .useParentHandlers = false для каждого из ваших регистраторов. - person jmehrens; 07.08.2013