Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Отключить логгер в готовом компоненте


Автор: maddoc 27.6.2010, 13:34
Есть сторонний jar. В нем объявлен  логгер. По умолчанию он выключен .
Код

 static 
    {
        Logger.getLogger("net.xxx.xx").setLevel(Level.OFF);
    }

Но при вызове некоторых методов внутри  он включается 
Код


      Logger.getLogger("net.xxx.xx").setLevel(Level.INFO);


и начинает слать сообщения в консоль. как его вырубить  не трогая jar?

Автор: Skipy 28.6.2010, 09:59
Опять вызвать 

Код

Logger.getLogger("net.xxx.xx").setLevel(Level.OFF);


Логгеры в пределах JVM можно получать по их имени из любой точки. Я вообще делал JMX bean для управления уровнями логирования в runtime.

Автор: maddoc 28.6.2010, 11:10
Skipy,  smile 
это и первокурснику ясно, но вызов методов с включением логгера происходит многократно и он переписывает мои выбор

Автор: Skipy 28.6.2010, 12:58
Так Вам просто надо вырубить определенный логгер? Делаете аппендер с типом org.apache.log4j.varia.NullAppender, выставляете additivity=false, чтобы не писал в родительский. Связываете нужный Вам логгер с этим аппендером. Всё.

P.S. Насчет log4j (надеюсь, у Вас он?) можно почитать вот это: http://www.skipy.ru/useful/logging.html

Автор: jk1 28.6.2010, 13:12
maddoc, при использовании java.util.logging можно использовать фильтр:
Код

 Logger.getLogger("net.xxx.xx").setFilter(new Filter() {
            public boolean isLoggable(LogRecord record) {
                return false;
            }
        });

после этого он уже ничего никуда не выведет.

Автор: maddoc 29.6.2010, 09:39
jk1, выводит

Автор: ivanovpv 29.6.2010, 09:42
Ну а добавить запись в log4j.properties?

Автор: maddoc 29.6.2010, 11:13
ivanovpv, 
Skipy, 

Код

log4j.rootLogger=INFO, stdout

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%c] %m%n


log4j.logger.org.apache.commons.httpclient=ERROR

log4j.appender.net.java.ao=org.apache.log4j.varia.NullAppender
log4j.logger.net.java.ao=ERROR
log4j.additivity.net.java.ao=false

 smile выводит

Автор: jk1 29.6.2010, 11:37
HttpClient использует JCL для логгирования. Возможно, у Вас срабатывает его дефолтный логгер, для него можно попробовать подкрутить соответствующие property:
Цитата

JCL is distributed with a very simple Log implementation named org.apache.commons.logging.impl.SimpleLog. This is intended to be a minimal implementation and those requiring a fully functional open source logging system are directed to Log4J.
SimpleLog sends all (enabled) log messages, for all defined loggers, to System.err. The following system properties are supported to configure the behavior of this logger:
org.apache.commons.logging.simplelog.defaultlog - Default logging detail level for all instances of SimpleLog. Must be one of:
    trace
    debug
    info
    warn
    error
    fatal
    If not specified, defaults to info.
org.apache.commons.logging.simplelog.log.xxxxx - Logging detail level for a SimpleLog instance named "xxxxx". Must be one of:
    trace
   debug
   info
   warn
   error
   fatal
If not specified, the default logging detail level is used.

Автор: ivanovpv 30.6.2010, 08:23
Попробуй объявить корневой логгер нулевым, а те которые нужны присобачить врукопашную к консолю. Тогда в пустоту уйдут все логи, кроме тех которые вручную присоединены к ненулевому аппендеру
Код

log4j.rootLogger=ALL, null
log4j.appender.null=org.apache.log4j.varia.NullAppender

log4j.logger.org.apache.commons.httpclient=ERROR
log4j.appender.org.apache.commons.httpclient=org.apache.log4j.ConsoleAppender

Автор: Skipy 30.6.2010, 11:06
Цитата(maddoc @ 29.6.2010,  11:13)
ivanovpv, 
Skipy, 

Код

log4j.appender.net.java.ao=org.apache.log4j.varia.NullAppender
log4j.logger.net.java.ao=ERROR
log4j.additivity.net.java.ao=false

 smile выводит

Вообще-то, имхо, должно быть так:

Код

log4j.appender.NowhereAppender=org.apache.log4j.varia.NullAppender
log4j.logger.net.java.ao=ERROR, NowhereAppender
log4j.additivity.net.java.ao=false


Вы же не указали логгеру, какой аппендер использовать!

Автор: maddoc 30.6.2010, 12:59
Skipy, sorry
Я писал по памяти, оригинал
Код

log4j.appender.orm=org.apache.log4j.varia.NullAppender
log4j.logger.net.java.ao=ERROR, orm
log4j.additivity.net.java.ao=false


Добавлено @ 13:04
ivanovpv, 

Код

#log4j.rootLogger=INFO, stdout
log4j.rootLogger=ALL, null
log4j.appender.null=org.apache.log4j.varia.NullAppender

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%c] %m%n

log4j.logger.org.apache.commons.httpclient=ERROR

log4j.appender.orm=org.apache.log4j.varia.NullAppender
log4j.logger.net.java.ao=ERROR, orm
log4j.additivity.net.java.ao=false

выводит

Осталось проверить способ 
jk1, 

Автор: ivanovpv 1.7.2010, 08:56
Надо убрать 3 последние строчки!
Код

log4j.appender.orm=org.apache.log4j.varia.NullAppender
log4j.logger.net.java.ao=ERROR, orm
log4j.additivity.net.java.ao=false


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

Автор: maddoc 1.7.2010, 11:55
 smile  smile  smile 

выводит

Автор: LSD 1.7.2010, 12:09
maddoc, ты бы для начала написал что за логгер использует эта твоя библиотека smile 

Автор: maddoc 1.7.2010, 13:49
дело в том, что мне по наследству достался огромныи проект, а это в ОРМ нем.

логгер java.util.logging  smile (тут собаку зарыли?)

Автор: Skipy 1.7.2010, 14:46
Цитата(maddoc @ 1.7.2010,  13:49)
логгер java.util.logging  smile (тут собаку зарыли?)

!!!!! МАТЬ-МАТЬ-МАТЬ!!!  smile  smile 

Пятый день толпа разработчиков пытается отключить лог через JUL настройками Log4J!!! Автор, а ведь я спрашивал - у Вас Log4J или нет?

Так, сейчас закончу материться, пойду искать рецепт для JUL...

UPD. В общем, принцип тот же. Делаете  NullHandler на основе java.util.logging.Handler, прописываете этот handler вашему логгеру. Как конфигурировать JUL - читаете тут: http://java.sun.com/javase/6/docs/technotes/guides/logging/overview.html

Автор: jk1 1.7.2010, 14:52
Цитата

дело в том, что мне по наследству достался огромныи проект, а это в ОРМ нем.

ОРМ? Это случаем не Hibernate?

Автор: maddoc 1.7.2010, 15:20
Skipy, 
"у меня" log4j + Slf4j
а эта хрень из ORM ActiveObjects 
+ есче несколько подпроектов в которих свои логеры, а я это все разгребаю и пытаюсь запустить

Автор: LSD 1.7.2010, 15:40
Если это и вправду java.util.logging.Logger то метод предложенный jk1 должен работать. Если он не работает, значит или это не java.util.logging.Logger или ты что-то не так делаешь.

Автор: jk1 1.7.2010, 21:10
maddoc,
Раз используется Slf4j, то он может пользоваться своим дефолтным логгером, если найдет его в classpath. Такой логгер просто будет выводить в System.out все логи вне зависимости от любых конфигов. Убедитесь, что в вашем случае в classpath не попадает slf4j-simple.jar, который и является упомянутым логгером.
 

Автор: ivanovpv 2.7.2010, 07:57
Цитата(maddoc @  1.7.2010,  13:49 Найти цитируемый пост)
логгер java.util.logging  smile (тут собаку зарыли?) 


А вот за это надо снижать репутацию!

Автор: Skipy 2.7.2010, 09:24
Цитата(maddoc @ 1.7.2010,  15:20)
Skipy, 
"у меня" log4j + Slf4j
а эта хрень из ORM ActiveObjects 

Ну да, у них JUL. И в коде действительно есть Logger.getLogger("...").setLevel(Level.INFO). Руки оторвать по самую голову.

В общем, пишите глухой аппендер и этот логгер на него.

Автор: maddoc 12.7.2010, 10:57
спасибо всем.
неделю болел, и не смотрел ответы.
парралельно написал такои код
Код


LogManager lm = LogManager.getLogManager();
        lm.reset();
        String config =
            "handlers = java.util.logging.ConsoleHandler\n" +
            ".level = OFF\n"+ 
            "java.util.logging.ConsoleHandler.level = OFF\n" +
            "java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter\n"; 
        try {
            lm.readConfiguration(new ByteArrayInputStream(config.getBytes()));
        } catch (SecurityException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

помогло. есчe раз спасибо, тему закрываю

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)