расширяет java.util.logging.Logger не работает

Я хочу расширить класс java.util.logging.Logger.

У меня есть следующий код. Я «форсирую ошибку» в нашем приложении, и созданный мной класс не вызывается.

Вот ошибка, которую я генерирую намеренно, но она не входит в код, который я написал:

//Generate error to test the logger
String[] myStringArray = new String[3];
String test;
test = myStringArray[5];    

Я также пробовал это, но это все еще не входит в мой код, даже если у меня есть такое же определение функции:

logger.log(Level.FINE, "test my logger");

Вот мое расширение регистратора. Возможно ли, чтобы это сработало, когда «возникло» необработанное исключение.

import java.util.logging.Level;
import java.util.logging.LogRecord;

public class MyLogger extends java.util.logging.Logger
{

    public MyLogger(String name, String resourceBundleName)
    {
        super(name, resourceBundleName);
        runMyLog();
    }


    public void log(Level level, String msg) {
        runMyLog();
    }   

    public void error(String msg)
    {
        super.log(Level.SEVERE, msg);
        runMyLog();
    }

    public void log(LogRecord record)
    {
        super.log(Level.SEVERE, record.getMessage());
        runMyLog();
    }

    public void severe(String msg) {
        log(Level.SEVERE, msg);
        runMyLog();
    }

    public void runMyLog(){
        String str = "lll";

        str="fdsafasdfdasfasd";
    }
}

person SomeGuy    schedule 22.06.2016    source источник
comment
Где вы создаете экземпляр своего класса регистратора?   -  person E-Riz    schedule 22.06.2016
comment
Он создан для каждого класса, который у нас есть. Вот пример: code открытый класс AuthModel реализует Serializable {... private static final Logger logger = Logger.getLogger(AuthModel.class.getName()); ... public String part1() выдает IOException { logger.log(Level.FINE, in part1); //---мой класс extensions не вызывается code   -  person SomeGuy    schedule 22.06.2016
comment
Как вы ожидаете, что getLogger() узнает о вашем подклассе, возврате и его экземпляре?   -  person E-Riz    schedule 22.06.2016
comment
Извините, я нажимаю Shift+Enter, но результат не работает! Даже пытался обернуть код в мини-уценку, но, похоже, это не работает. Извините, новичок на этом сайте.   -  person SomeGuy    schedule 22.06.2016
comment
потому что я продлеваю его? Правильно ?   -  person SomeGuy    schedule 22.06.2016
comment
Вы можете отредактировать вопрос, чтобы добавить больше кода. Не добавляйте это в комментарии.   -  person E-Riz    schedule 22.06.2016
comment
Спасибо. Из того, что я прочитал, я могу расширить класс регистратора, просто используя: открытый класс MyLogger extends java.util.logging.Logger ... Что еще мне нужно сделать?   -  person SomeGuy    schedule 22.06.2016
comment
Определение подкласса и получение экземпляров этого подкласса — две разные вещи. Честно говоря, это очень простая тема программирования на Java и объектно-ориентированном программировании, совсем не относящаяся к логированию.   -  person E-Riz    schedule 22.06.2016
comment
Я вижу подобные примеры, я не уверен, что понимаю. [ссылка]stackoverflow.com/questions/28451374/   -  person SomeGuy    schedule 22.06.2016
comment
Обычно не рекомендуется расширять Logger, особенно если вы не совсем понимаете ООП. См. информационную заметку о подклассах docs.oracle.com /javase/6/docs/api/java/util/logging/Logger.html   -  person leonbloy    schedule 22.06.2016


Ответы (1)


Как отметили @leonbloy и @E-Riz, согласно документация:

Следовательно, любые подклассы Logger (если только они не реализованы в сочетании с новым классом LogManager) должны позаботиться о получении экземпляра Logger из класса LogManager и должны делегировать такие операции, как «isLoggable» и «log (LogRecord)», этому экземпляру. . Обратите внимание, что для перехвата всех выходных данных журнала подклассам нужно только переопределить метод log(LogRecord). Все остальные методы ведения журнала реализованы как вызовы этого метода журнала (LogRecord).

Итак, вот пример, который нужно запустить с -Djava.util.logging.manager=bad.idea.OdiousLogManager, чтобы JVM использовала новый LogManager:

package bad.idea;

import java.awt.Toolkit;
import java.util.logging.Level;
import java.util.logging.LogManager;
import java.util.logging.LogRecord;
import java.util.logging.Logger;

public class OdiousLogManager extends LogManager {

    @Override
    public synchronized Logger getLogger(String name) {
        Logger l = super.getLogger(name);
        if (l == null) {
            l = new AbhorentLogger(name, null);
            super.addLogger(l);
        }
        return l;
    }


    private static class AbhorentLogger extends Logger {

        AbhorentLogger(String name, String resourceBundleName) {
            super(name, resourceBundleName);
        }

        @Override
        public void log(LogRecord record) {
            super.log(record);
            mightyCatHearMeRoar(record);
        }

        private void mightyCatHearMeRoar(LogRecord record) {
            if (super.isLoggable(record.getLevel())) {
                Toolkit.getDefaultToolkit().beep();
            }
        }
    }


    //...
    private static final Logger logger = Logger.getLogger("godaweful");
    public static void main(String[] args) {
        logger.severe(logger.getClass().getName());
    }
}

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

person jmehrens    schedule 22.06.2016
comment
Спасибо, не хватало @override. - person SomeGuy; 27.06.2016
comment
Похоже, это единственный разработанный способ подкласса реализации JUL, и это немного громоздко. Основным недостатком этого является то, что он не позволяет вам делать то, что мне нужно, а именно расширять Logger API дополнительными методами (например, некоторыми вспомогательными методами). - person Guss; 18.10.2016
comment
@Guss Если вы хотите связать свое приложение с подклассами LogManager и Logger, вы всегда можете привести результат getLogger. private static final AbhorentLogger logger = (AbhorentLogger) Logger.getLogger("logger.name"); - person jmehrens; 18.10.2016
comment
Да, нисходящее приведение — это последнее убежище, если люди застряли в плохом API... :-( Мое эмпирическое правило — если вы делаете нисходящее приведение, вы используете плохой API. - person Guss; 18.10.2016