`

你知道Log.isLoggable

阅读更多
我们可以通过Log.isLoggable来动态开关log的输出。
http://androidxref.com/8.1.0_r33/xref/frameworks/base/core/java/android/util/Log.java
android.util.Log中的isLoggable方法解析:
    /**
     * Checks to see whether or not a log for the specified tag is loggable at the specified level.
    *
     *  The default level of any tag is set to INFO. This means that any level above and including
     *  INFO will be logged. Before you make any calls to a logging method you should check to see
     *  if your tag should be logged. You can change the default level by setting a system property:
     *      'setprop log.tag.<YOUR_LOG_TAG> <LEVEL>'
     *  Where level is either VERBOSE, DEBUG, INFO, WARN, ERROR, ASSERT, or SUPPRESS. SUPPRESS will
     *  turn off all logging for your tag. You can also create a local.prop file that with the
     *  following in it:
     *      'log.tag.<YOUR_LOG_TAG>=<LEVEL>'
     *  and place that in /data/local.prop.
     *
     * @param tag The tag to check.
     * @param level The level to check.
     * @return Whether or not that this is allowed to be logged.
     * @throws IllegalArgumentException is thrown if the tag.length() > 23
     *         for Nougat (7.0) releases (API <= 23) and prior, there is no
     *         tag limit of concern after this API level.
     */

public static native boolean isLoggable(String tag, int level);
其默认的等级是INFO,只有INFO以上的级别可以输出,若我们需要修改其等级,可以通过adb shell setprop TAG LEVEL这种方法来调整,或者是修改local.prop来设置

其应用可以参考
http://androidxref.com/8.1.0_r33/xref/packages/apps/DeskClock/src/com/android/deskclock/LogUtils.java
63        /**
         * Log everything for debug builds or if running on a dev device.
         */
        public final static boolean DEBUG = BuildConfig.DEBUG
                || "eng".equals(Build.TYPE)
                || "userdebug".equals(Build.TYPE);

        public final String logTag;

        public Logger(String logTag) {
            this.logTag = logTag;
        }

        public boolean isVerboseLoggable() { return DEBUG || Log.isLoggable(logTag, Log.VERBOSE); }
        public boolean isDebugLoggable() { return DEBUG || Log.isLoggable(logTag, Log.DEBUG); }
        public boolean isInfoLoggable() { return DEBUG || Log.isLoggable(logTag, Log.INFO); }
        public boolean isWarnLoggable() { return DEBUG || Log.isLoggable(logTag, Log.WARN); }
        public boolean isErrorLoggable() { return DEBUG || Log.isLoggable(logTag, Log.ERROR); }
        public boolean isWtfLoggable() { return DEBUG || Log.isLoggable(logTag, Log.ASSERT); }


比如:
public static final String TAG = "Test";
public static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);

public void onCreate(){
    if (DEBUG){
        Log.d(TAG, "onCreate");
    }
}

adb shell setprop log.tag.Test D
若是App,则退出APP,重新进入,即可打印Log,若是Framework,则需要执行adb shell stop
adb shell start


分享到:
评论

相关推荐

    Log.isLoggable之一正确的使用姿势

    `Log.isLoggable` 是Android SDK提供的一种方法,用于判断当前设备的日志级别是否允许输出特定级别的日志。这个方法可以帮助开发者控制日志信息的显示,特别是在发布版本中减少不必要的日志输出,以提高性能和保护...

    Java日志组件间关系详解

    SLF4J设计时考虑到兼容性,提供了桥接机制,例如SLF4J-log4j12,这个桥接器使得我们可以使用SLF4J的API,同时让日志输出由Log4j处理。桥接器的存在允许我们灵活地切换不同的日志实现,而不必修改大量的代码。 **...

    android中Log的实现机制

    此外,`Log`类还提供了`isLoggable()`方法来检查当前设定的日志级别是否允许特定的日志级别输出。 #### 四、JNI及C/C++域写设备文件 在Java层调用的`Log`类方法最终会通过JNI调用到C/C++层的实现。例如,`Log.d()`...

    Java开发你的收集器获得更好的性能.pdf

    如果`log.isLoggable()`返回`true`,才会执行`log.log()`,这减少了在不记录日志时的计算开销。 在性能优化中,JVM(Java虚拟机)会进行一些自动优化,如数组边界检查的优化,有时甚至会展开循环来提升速度。然而,...

    java收集器用做高级货归约.pdf

    日志输出的优化可以显著提升应用的性能,例如标题中提到的日志优化方式:使用`log.isLoggable()`来检查日志级别,避免无用的计算。只有当日志级别开启时,才会执行`log.log()`中的详细操作,这样可以防止在不需要...

    Java中的函数.pdf

    描述中提到的示例展示了如何在Java中使用条件语句和`log.isLoggable()`来检查是否需要记录日志,避免了不必要的计算。这种方式可以在不牺牲性能的情况下,确保只有需要的日志信息被记录。在日志函数中使用`log.log()...

    java日志.txt

    public boolean isLoggable(LogRecord record) { if (record.getThrown() != null) { return true; } else { return false; } } ``` - **Formatter**: `Formatter`接口负责将日志记录格式化为字符串。默认...

    Java类型检查,类型推断以及限制.pdf

    通过在调用`log.isLoggable()`进行检查后再执行`log.log()`,可以避免在日志级别不满足时执行昂贵的计算(如`calcX()`和`calcY()`)。这是Java性能优化的一个基本策略,即延迟计算直到绝对必要时才执行。 数组和...

    Java模式匹配功能详解 (2).pdf

    `if (log.isLoggable(Level.FINE))` 这一行代码确保只有在日志级别允许的情况下才会执行记录操作,避免了不必要的计算(如`calcX()`和`calcY()`)。 当涉及到性能优化时,Java虚拟机(JVM)可以进行一些自动优化,...

    Java规约和汇总.pdf

    例如,使用`log.isLoggable()`进行条件判断,避免不必要的计算。在给定的例子中,如果日志级别设置为FINE,才会执行`calcX()`和`calcY()`的计算,从而减少无谓的性能开销。这种做法体现了对性能敏感的编程思维。 在...

    Java实现和维护系统详解.pdf

    `if (log.isLoggable(Level.FINE))`这一行首先检查日志级别是否允许输出FINE级别的信息,如果允许才执行`log.log()`方法,这样可以避免在不记录日志时执行昂贵的计算。 在Java中,JVM(Java虚拟机)能够进行一些...

    LogUtils.zip

    为避免在性能敏感的代码中过度使用日志,LogUtils可能包含条件编译,比如使用`Log.isLoggable()`检查当前日志级别是否开启,或者在release版本中移除日志输出。 7. **多线程支持**: 在多线程环境中,日志输出...

    Java 什么是函数式编程.pdf

    通过使用`if (log.isLoggable(Level.FINE))`来判断是否需要记录日志,避免了在不必要时调用昂贵的`calcX()`和`calcY()`函数。这种做法遵循了“不要过早优化”的原则,只有在确实需要时才执行耗时的操作。 性能分析...

    Java类库的更新.pdf

    在日志编码方面,描述中提到的优化方法是利用 `log.isLoggable()` 检查来避免不必要的计算。这种方法确保只有在日志级别允许的情况下才会执行耗时的计算,如 `calcX()` 和 `calcY()`。这样可以显著提升性能,特别是...

    Android-Android日志工具支持Logcat输出和文件记录

    为了实现日志级别控制,可以使用`Log.isLoggable()`方法检查当前日志级别是否允许输出指定级别的日志。 此外,该工具可能提供了接口或设置选项,允许开发者自定义日志文件的存储路径、文件名格式以及日志输出格式。...

    Java新的日期和API.pdf

    例如,如果在日志记录中使用`if (log.isLoggable(Level.FINE))`条件来控制输出,可以避免不必要的格式化操作,提高性能。 总的来说,Java 8的日期和时间API是Java平台的一个重大改进,它提高了开发者的生产力,提供...

    Java筛选和切片.pdf

    例如,通过在日志语句中使用`if (log.isLoggable())`检查,我们可以确保只有在日志级别匹配时才会执行实际的记录操作,从而减少计算开销。 Java 8引入了流(Streams) API,这是一个强大的工具,允许我们以声明式的...

    Java归约功能功能详解.pdf

    日志代码的优化,如示例所示,使用`log.isLoggable()`进行条件判断,避免不必要的计算,这是一种很好的实践,可以减少无用的日志输出对性能的影响。在循环中,Java虚拟机(JVM)可以通过优化,比如数组边界检查的...

    Java scala功能介绍解释.pdf

    以Java为例,一个良好的日志实践是在输出时进行条件检查,如描述中所示的if (log.isLoggable(Level.FINE)) 语句,这样可以避免不必要的计算。此外,JVM能够对循环进行优化,如数组边界检查的优化和循环展开,以提高...

    android-nologs-plugin:从使用 Gradle 和 Android 新构建系统构建的 android 应用程序中删除日志

    另一种方法是使用以下 Proguard 规则删除日志: -assumenosideeffects class android.util.Log { public static boolean isLoggable(java.lang.String, int); public static int v(...); public static int i(.

Global site tag (gtag.js) - Google Analytics