Что лучший способ состоит в том, чтобы подавить консольное предупреждение во время выполнения в Java?

Частичный ответ, потому что он слишком велик для комментария, а также потому, что у меня нет желания настраивать и запускать новые эксперименты прямо сейчас. (Если кто-то отправляет ответ с обновленными, проверяемыми номерами, он получает мое одобрение.)

Вот примерный набросок того, что происходит, когда у вас есть Tampermonkey, Violentmonkey и т. Д. И установлены пользовательские скрипты:

  1. Каждая страница, которую вы посещаете , проверяется на соответствие директивам @include, @match и @exclude каждого активного пользовательского скрипта . Более умные движки сначала проверят @exclude и остановятся, если совпадение найдено.

    Некоторые движки лучше справляются с этой проверкой, чем другие, и в идеале информация о совпадении сайтов должна храниться в памяти для максимальной скорости.

  2. Каждый <frame> или iframe на всех посещаемых вами страницах сверяются с директивами @include, @match и @exclude каждого активного пользовательского скрипта, если только этот скрипт не имеет @noframes установлено.

  3. Если скрипт соответствует странице (или фрейму), то Tampermonkey (и т. Д.) Должен:
    (A) Извлечь код скрипта и любые данные - часто с диска (медленно).
    (B) Затем создайте некоторый уровень песочницы - в зависимости от движка, браузера и режима @grant.
    (C) Вставьте скрипт в вышеупомянутую песочницу - почти всегда обернутую анонимной функцией - и запустите его.

  4. Затем пользовательский скрипт будет использовать ресурсы в зависимости от своего кода.

В общем:

  1. @match работает лучше (проверено годами ранее), чем @include. Если вы собираетесь использовать 1000 строк, используйте @match вместо include.

  2. Используйте @noframes, если у вас нет причин не делать этого.

  3. В идеале шаги 1 и 2 могут быть выполнены из памяти (нужно посмотреть, что в данный момент делают различные движки), а партия из @include может быть обработана за то же время, что и для введите один пользовательский скрипт. (Кто-нибудь хочет попробовать собрать какие-нибудь числа?)
  4. Если пользовательский скрипт или его данные (@require файлы, @resource файлы, GM_setValue данные) должны быть извлечены с диска, то это сравнительно огромная задержка во времени. (Но все же это быстрее, чем извлекать информацию из Интернета.)

Наконец, время и возможное напряжение из-за необходимости поддерживать большой список сайтов, редактируя файл usercript каждый время должно быть по сравнению с тем, насколько инвазивен ваш сценарий .

Если бы это был я, а скрипт только задерживал страницы менее чем на 300 миллисекунд, я бы просто держал свой нос и использовал:

// @match    *://*/*
// @noframes

Однако, если скрипт более инвазивен, он медленнее или более ресурсоемкий, вы можете использовать гибридный подход ...
Сохраните список сайтов, на которых будет полностью работать, в данных GM_setValue и / или в файле @resource d.

Таким образом, вы можете редактировать список на лету, используя, например, команды меню; или через редактор данных скрипта Tampermonkey; или даже с помощью кнопок, которые вы создаете для этой цели. Однако все это выходит за рамки этого вопроса.

17
задан seansand 13 April 2009 в 19:13
поделиться

5 ответов

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

Вам действительно лучше использовать потоки.

Тем не менее, вы можете взломать его, временно заменив System.err или System.out. Это просто объекты PrintStream , и они устанавливаются с помощью методов setOut и setErr.

PrintStream oldErr = System.err;
PrintStream newErr = new PrintStream(new ByteArrayOutputStream());
System.setErr(newErr);

// do your work

System.setErr(oldErr);

Редактировать:

Я согласен, что было бы предпочтительнее использовать потоки, но, как сейчас, целевой API, где мне нужно поставить Ответ - байтовый массив. Если необходимо, мы можем сделать рефакторинг к API, который позволит ему принять поток; это было бы лучше. предупреждение определенно есть для причина.

Если вы можете изменить API, сделайте это. Потоковая обработка - лучший способ пойти в этом случае. Если вы не можете из-за внутреннего давления или чего-то еще, идите @John M по маршруту и ​​накачайте BUFFER_WARN_TRIGGER_LIMIT - но убедитесь, что у вас есть известное contentLength, или даже что Маршрут не удастся.

11
ответ дан 30 November 2019 в 10:24
поделиться

Выводится ли библиотека через log4j? если это так, сработает редактирование свойств log4j.properties, чтобы установить для выхода этого класса значение «ОШИБКА», например

log4j.logger.org.apache.commons.httpclient.methods.PostMethod=ERROR
8
ответ дан 30 November 2019 в 10:24
поделиться

Предполагая, что предупреждение записано в stderr, вы всегда можете подавить предупреждение, отправив stderr в / dev / null или любой другой эквивалент в вашей системе.

1
ответ дан 30 November 2019 в 10:24
поделиться

Эта проблема уже обсуждалась в ASF JIRA . Есть два способа решить эту проблему:

  • Установить более высокое значение для BUFFER_WARN_TRIGGER_LIMIT . Достаточно высокое значение с большей вероятностью подавит предупреждение; однако это противоречит цели самого предупреждения. Если вы буферизуете большой объем данных для последующего анализа за один проход, лучше прочитать данные из потока в массив, прежде чем работать с массивом.
  • Установите для уровня ведения журнала более высокое значение для HttpClient, если Вы можете использовать ERROR или FATAL.
4
ответ дан 30 November 2019 в 10:24
поделиться

Если вы хотите аккуратно остановить эту запись в журнале, есть настраиваемый максимум, который выдает предупреждение. Я видел это , глядя на код .

        int limit = getParams().getIntParameter(HttpMethodParams.BUFFER_WARN_TRIGGER_LIMIT, 1024*1024);
        if ((contentLength == -1) || (contentLength > limit)) {
            LOG.warn("Going to buffer response body of large or unknown size. "
                    +"Using getResponseBodyAsStream instead is recommended.");
        }

HttpMethodBase.setParams () выглядит как место для установки HttpMethodParams.BUFFER_WARN_TRIGGER_LIMIT на желаемое значение.

19
ответ дан 30 November 2019 в 10:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: