Написание простого метода печати для отладки в Java - PullRequest
0 голосов
/ 05 августа 2011

Прежде чем я заново изобрету колесо - я хочу иметь возможность вставлять отладочные следы в мой код, например say("We are here.");, без определения static void say() в каждом классе. Он должен выполнять System.out.println(s) и быть глобально включенным или выключенным (doSay(false)), и я также хотел бы, чтобы он мог идентифицировать класс, из которого он вызывается (, как описано здесь ). Например:

MyClass: мы здесь.

У Java уже есть такой инструмент?

Ответы [ 7 ]

3 голосов
/ 05 августа 2011

Используйте SLF4j, , а не log4j (по крайней мере, не напрямую). Они оба созданы одним и тем же автором, Ceki Gülcü, но SLF4J включает в себя знания, полученные при использовании log4j и просмотре достижений в других пакетах журналирования.

SLF4J - это общий API для ряда различных базовых систем ведения журналов, таких как log4j, пакет java.util.logging и т. Д. Он также имеет свою собственную "собственную" реализацию, logback.

Одна из причин, почему мне нравится это лучше, чем log4j, - это поддержка шаблонов сообщений. Эти упрощают ваш код.

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

1 голос
/ 05 августа 2011

Да.Это называется каркасом логирования.Ява имеет java.util.logging.Но многие предпочитают использовать Log4J .

1 голос
/ 05 августа 2011

Самая популярная среда ведения журналов Java - Log4J , которая делает это (и многое другое).

Смотрите здесь для списка других.

0 голосов
/ 05 августа 2011

Я не знал о статическом импорте! Я объединил идеи @ninetwozero, @karl и @erickson, чтобы создать это:

package myPkg;
public class CLHUtilities {

    private static boolean saying = false;
    public static void tracing(boolean b) {
        saying = b;
    }

    /*
     * Technique taken from:
     * /175234/kakoi-klass-vyzval-moi-staticheskii-metod
     */
    public static void say(String s) {
        if (saying) {
            Throwable t = new Throwable();
            StackTraceElement[] trace = t.getStackTrace();
            String className = trace[1].getClassName();
            String whoCalledMe = null;
            try {
                whoCalledMe = Class.forName(className).getSimpleName();
            } catch (Exception e) {
            }
            System.out.println(whoCalledMe + ": " + s);
        }

    }
}

, который можно использовать просто как:

import static myPkg.CLHUtilities.*;
 :
tracing(true);
 :
say("We are here.");

Что идеально подходит для моих нужд.

0 голосов
/ 05 августа 2011

Почему бы не объявить статически функцию в вашем Main.java и не использовать ее всесторонне?

public class Main {

    private static boolean debug;

    public static void setDebug(boolean d) { Main.debug = d; }

    public static void say(String s) { if(Main.debug) System.out.println(s); }

}

Дайте мне знать, если это соответствует вашим потребностям.

Редактировать: исправлен код

0 голосов
/ 05 августа 2011

Java имеет более продвинутые инструменты ведения журналов, такие как log4j или logback. Там вы должны создать public static final Logger logger = Logger.getLogger(..) и использовать регистратор для записи сообщений отладки / информации / предупреждений / ошибок в любое удобное для вас место. Они легко настраиваются - что и где регистрировать.

В более простом случае (если это игрушечный проект) вы можете просто определить класс с помощью метода public static void log(..) и использовать его из каждого класса.

0 голосов
/ 05 августа 2011

Вы можете использовать регистратор, такой как Apache Log4J , и сделать что-то вроде logger.trace("We are here");.Если вы хотите отключить это, установите более высокий уровень журнала (отладка, предупреждение, ошибка) в вашей конфигурации, и журналы trace исчезнут.

...