你通常如何标记日志条目?(机器人)

and*_*rii 83 logging android

我假设大多数人都知道android.util.Log所有日志记录方法都接受'String tag'作为第一个参数.

我的问题是你通常如何在应用程序中标记日志? 我见过这样的硬编码:

public class MyActivity extends Activity {
    private static final String TAG = "MyActivity";
    //...
    public void method () {
        //...
        Log.d(TAG, "Some logging");
    }
}
Run Code Online (Sandbox Code Playgroud)

由于许多原因,这看起来不太好:

  • 你可以告诉我这段代码没有硬编码,但确实如此.
  • 我的应用程序可以在具有相同名称的不同包中包含任意数量的类.因此很难阅读日志.
  • 它不灵活.你总是把私人田地TAG放进你的班级.

是否有任何巧妙的方法来获得课程的TAG?

gia*_*npi 166

我使用TAG,但我将其初始化为:

private static final String TAG = MyActivity.class.getName();
Run Code Online (Sandbox Code Playgroud)

这样,当我重构代码时,标记也会相应地改变.

  • 我以同样的方式定义TAG常量.但是,我想知道,代码混淆工具将如何影响我的类名,结果是这个常量的值? (21认同)
  • 正如Ralph Mueller所提到的,如果你使用Proguard(正如大多数Android项目那样)来混淆类名,这种技术就不起作用了. (14认同)
  • 您可能想尝试this.getClass().getSimpleName()以避免TAG的长度限制.如果tag.length()> 23,则抛出IllegalArgumentException. (11认同)
  • 为什么不删除静态并使用`this.getClass().getName()`来使其更通用? (4认同)

Yan*_*niv 15

我通常创建一个App位于不同包中的类,并包含有用的静态方法.其中一种方法是一种getTag()方法,这种方式我可以随处获得TAG.
Appclass看起来像这样:

编辑:改进每个暴民评论(谢谢:))

public class App {

    public static String getTag() {
        String tag = "";
        final StackTraceElement[] ste = Thread.currentThread().getStackTrace();
        for (int i = 0; i < ste.length; i++) {
            if (ste[i].getMethodName().equals("getTag")) {
                tag = "("+ste[i + 1].getFileName() + ":" + ste[i + 1].getLineNumber()+")";
            }
        }
        return tag;
    }

}
Run Code Online (Sandbox Code Playgroud)

当我想使用它时:

Log.i(App.getTag(), "Your message here");
Run Code Online (Sandbox Code Playgroud)

getTag方法的输出是调用者类的名称(包名称),以及getTag调用它的行号,以便于调用.

  • 我绝对不会这样做.如果你这样做,你的日志声明会受到很大影响.如果你这样做,你肯定希望让proguard删除日志消息,除了生产版本上的警告. (6认同)
  • 这可能不再推荐,因为标签长度现在限制为 23 个字符 (2认同)

Nic*_*ini 10

转到Android Studio - >首选项 - >实时模板 - > AndroidLog然后选择Log.d(TAG,String).

模板文本替换中

android.util.Log.d(TAG, "$METHOD_NAME$: $content$");

android.util.Log.d("$className$", "$METHOD_NAME$: $content$");

Android菜单的图像

然后单击编辑变量并在className Name列旁边的Expression列中输入className().Android菜单2的图像

现在,当您键入logd它将放置的快捷方式时

Log.d("CurrentClassName", "currentMethodName: ");
Run Code Online (Sandbox Code Playgroud)

你不需要再定义TAG了.

  • 我喜欢这种方式,但是我宁愿创建一个新的日志条目,而不是修改现有的日志条目,只是为了安全起见,如果它在未来的更新中发生了变化. (2认同)

小智 8

我喜欢改善Yaniv的答案,如果你有这种格式的日志(filename.java:XX)xx行号,你可以链接快捷方式,当出现错误时,链接方式相同,这样我可以直接到相关的行只需单击logcat即可

我把它放在我的扩展应用程序中,所以我可以在其他所有文件中使用

public static String getTag() {
    String tag = "";
    final StackTraceElement[] ste = Thread.currentThread().getStackTrace();
    for (int i = 0; i < ste.length; i++) {
        if (ste[i].getMethodName().equals("getTag")) {
            tag = "("+ste[i + 1].getFileName() + ":" + ste[i + 1].getLineNumber()+")";
        }
    }
    return tag;
}
Run Code Online (Sandbox Code Playgroud)

截图:

  • 这可能不再推荐,因为标签长度现在限制为23个字符 (3认同)