Как включить / отключить уровни журналов в Android? - PullRequest
146 голосов
/ 07 января 2010

У меня есть много операторов регистрации для отладки, например.

Log.v(TAG, "Message here");
Log.w(TAG, " WARNING HERE");

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

Ответы [ 18 ]

2 голосов
/ 15 мая 2013

Может быть, вы можете увидеть этот класс расширения журнала: https://github.com/dbauduin/Android-Tools/tree/master/logs.

Это позволяет вам точно контролировать логи. Например, вы можете отключить все журналы или только журналы некоторых пакетов или классов.

Более того, он добавляет некоторые полезные функции (например, вам не нужно передавать тег для каждого журнала).

2 голосов
/ 23 октября 2013

Я создал Utility / Wrapper, который решает эту проблему + другие распространенные проблемы, связанные с ведением журнала.

Утилита отладки со следующими функциями:

  • Обычные функции, предоставляемые классом Log, заключены в LogMode s.
  • Метод журналов входа-выхода: может быть отключен с помощью переключателя
  • Выборочная отладка: отладка определенных классов.
  • Измерение времени выполнения метода: время выполнения для отдельных методов, а также общее время, потраченное на все методы класса.

Как использовать?

  • Включите класс в ваш проект.
  • Используйте его так же, как вы используете методы android.util.Log, для начала.
  • Используйте функцию журналов Entry-Exit, вызывая методы entry_log () - exit_log () в начале и в конце методов вашего приложения.

Я пытался сделать документацию самодостаточной.

Предложения по улучшению этой Утилиты приветствуются.

Бесплатное использование / обмен.

Загрузите его с GitHub .

1 голос
/ 06 августа 2015

Мы можем использовать класс Log в нашем локальном компоненте и определить методы как v / i / e / d. На основании необходимости мы можем сделать звонок дальше.
Пример показан ниже.

    public class Log{
        private static boolean TAG = false;
        public static void d(String enable_tag, String message,Object...args){
            if(TAG)
            android.util.Log.d(enable_tag, message+args);
        }
        public static void e(String enable_tag, String message,Object...args){
            if(TAG)
            android.util.Log.e(enable_tag, message+args);
        }
        public static void v(String enable_tag, String message,Object...args){
            if(TAG)
            android.util.Log.v(enable_tag, message+args);
        }
    }
    if we do not need any print(s), at-all make TAG as false for all else 
    remove the check for type of Log (say Log.d).
    as 
    public static void i(String enable_tag, String message,Object...args){
    //      if(TAG)
            android.util.Log.i(enable_tag, message+args);
    }

здесь сообщение для string, а args - это значение, которое вы хотите напечатать.

1 голос
/ 28 марта 2013

В очень простом сценарии ведения журнала, когда вы буквально просто пытаетесь записать данные на консоль во время разработки для целей отладки, может быть проще всего выполнить поиск и замену перед сборкой и закомментировать все обращения к журналу. или System.out.println.

Например, если вы не используете «Журнал». В любом месте, кроме вызова Log.d или Log.e и т. д., вы можете просто найти и заменить все решение, чтобы заменить «Журнал». с "// Log." чтобы закомментировать все ваши журналы вызовов, или в моем случае я просто использую System.out.println везде, поэтому перед тем, как перейти к производству, я просто сделаю полный поиск и заменит «System.out.println» и заменим на «//System.out.println".

Я знаю, что это не идеально, и было бы неплохо, если бы в Eclipse была встроена возможность находить и комментировать вызовы Log и System.out.println, но до тех пор, пока это не произойдет, самый простой, быстрый и лучший способ сделать это, чтобы закомментировать путем поиска и замены. Если вы сделаете это, вам не придется беспокоиться о несоответствии номеров строк трассировки стека, потому что вы редактируете свой исходный код и не добавляете никаких служебных данных, проверяя некоторую конфигурацию уровня журнала и т. Д.

1 голос
/ 19 сентября 2013

В моих приложениях у меня есть класс, который оборачивает класс Log, который имеет статическую логическую переменную, называемую «state». Во всем моем коде я проверяю значение переменной «состояние» статическим методом, прежде чем записывать в журнал. Затем у меня есть статический метод для установки переменной «состояние», которая гарантирует, что значение является общим для всех экземпляров, созданных приложением. Это означает, что я могу включить или отключить все журналы для приложения в один вызов - даже когда приложение работает. Полезно для звонков в службу поддержки ... Это означает, что вы должны придерживаться своего оружия при отладке и не возвращаться к использованию стандартного класса Log, хотя ...

Также полезно (удобно), что Java интерпретирует логическое значение var как false, если ему не присвоено значение, что означает, что его можно оставить равным false до тех пор, пока вам не потребуется включить ведение журнала: -)

0 голосов
/ 06 мая 2019

Однако System.setProperty() хранит совершенно другой набор свойств по сравнению со свойствами, к которым можно получить доступ командой getprop, которая может быть выдана в оболочке ADB. Следовательно, даже если вы попытаетесь использовать System.setProperty() для хранения уровня журнала для тега, он будет не работать.

Как уже упоминалось, вы можете использовать adb shell setprop

adb shell setprop log.tag.<YOUR_LOG_TAG> <LEVEL>

Уровни основного журнала

Примечания к значению уровня журнала

ERROR       6       Errors<br/>
WARN        5       Warnings
INFO        4       Information messages    <-Default level of any tag (any level above and including INFO)
DEBUG       3       Debug output 
VERBOSE     2       For development only 

Подробнее здесь

0 голосов
/ 24 декабря 2018

Другим способом является использование платформы ведения журналов, которая имеет возможность открывать и закрывать журналы. Это может дать большую гибкость иногда даже для рабочего приложения, журналы которого должны быть открыты, а какие - закрыты, в зависимости от того, какие у вас проблемы например:

0 голосов
/ 02 февраля 2015

Для меня часто полезно иметь возможность устанавливать разные уровни журнала для каждого тега.

Я использую этот очень простой класс-оболочку:

public class Log2 {

    public enum LogLevels {
        VERBOSE(android.util.Log.VERBOSE), DEBUG(android.util.Log.DEBUG), INFO(android.util.Log.INFO), WARN(
                android.util.Log.WARN), ERROR(android.util.Log.ERROR);

        int level;

        private LogLevels(int logLevel) {
            level = logLevel;
        }

        public int getLevel() {
            return level;
        }
    };

    static private HashMap<String, Integer> logLevels = new HashMap<String, Integer>();

    public static void setLogLevel(String tag, LogLevels level) {
        logLevels.put(tag, level.getLevel());
    }

    public static int v(String tag, String msg) {
        return Log2.v(tag, msg, null);
    }

    public static int v(String tag, String msg, Throwable tr) {
        if (logLevels.containsKey(tag)) {
            if (logLevels.get(tag) > android.util.Log.VERBOSE) {
                return -1;
            }
        }
        return Log.v(tag, msg, tr);
    }

    public static int d(String tag, String msg) {
        return Log2.d(tag, msg, null);
    }

    public static int d(String tag, String msg, Throwable tr) {
        if (logLevels.containsKey(tag)) {
            if (logLevels.get(tag) > android.util.Log.DEBUG) {
                return -1;
            }
        }
        return Log.d(tag, msg);
    }

    public static int i(String tag, String msg) {
        return Log2.i(tag, msg, null);
    }

    public static int i(String tag, String msg, Throwable tr) {
        if (logLevels.containsKey(tag)) {
            if (logLevels.get(tag) > android.util.Log.INFO) {
                return -1;
            }
        }
        return Log.i(tag, msg);
    }

    public static int w(String tag, String msg) {
        return Log2.w(tag, msg, null);
    }

    public static int w(String tag, String msg, Throwable tr) {
        if (logLevels.containsKey(tag)) {
            if (logLevels.get(tag) > android.util.Log.WARN) {
                return -1;
            }
        }
        return Log.w(tag, msg, tr);
    }

    public static int e(String tag, String msg) {
        return Log2.e(tag, msg, null);
    }

    public static int e(String tag, String msg, Throwable tr) {
        if (logLevels.containsKey(tag)) {
            if (logLevels.get(tag) > android.util.Log.ERROR) {
                return -1;
            }
        }
        return Log.e(tag, msg, tr);
    }

}

Теперь просто установите уровень журнала для каждого тега в начале каждого класса:

Log2.setLogLevel(TAG, LogLevels.INFO);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...