日志记录标记最多可包含23个字符

时间:2015-01-27 10:47:46

标签: android logging android-studio

自更新AS 1.1预览2以来,我的所有Log消息

下都出现了红线
Log.d(TAG, "message");

带消息:“日志记录标记最多可包含23个字符.. ”。

除了Android Studio本身,我没有从根本上更新任何内容。这是一个错误吗?

8 个答案:

答案 0 :(得分:43)

如果您愿意,可以将其禁用。

在Android Studio中,分析 - >检查代码。

screenshot

在检查配置文件下,单击带有3个水平点的按钮。

应打开以下窗口。搜索" log"并取消选中"太长的日志标记"。

screenshot

更新: Android Studio 2.2,它位于Android Lint:正确性

screenshot

答案 1 :(得分:36)

不,这不是错误。

来自Android Studio's Recent Changes on 1.1 Preview 2

  

检查传递给日志记录调用的标记(如果其值可以解析)最多为23个字符(根据Logging API的要求。)

     

logging tag was 31

正如最近对最近的更改所解释的那样,这是由于Log API不允许标记超过23个字符。

SLF4J Android对此有一个解释:

  

[...]此类标签的长度目前限制为23个字符(23 = 32 - 8表示名称空间前缀 - 1表示C终结符)

匹配Android's source code

目前,唯一明确提到此例外的功能是Log.isLoggable()

  

...

     

<强>抛出

     如果tag.length()&gt;会抛出

IllegalArgumentException 23。

但是,基于注释,显然记录器会在发布模式下抛出异常(在调试模式下会被忽略)。

您可以按照Terence's answer禁用lint检查,但您已收到警告。

答案 2 :(得分:18)

补充@Terence

的答案

您还可以在build.gradle文件中通过gradle关闭特定检查:

root

或者使用xml:

将lint.xml文件添加到项目中
lintOptions {
    disable 'LongLogTag'
}

答案 3 :(得分:5)

您永远不会忽略此lint检查,它肯定会在您的发布版本上带来意外结果,因为它会抛出异常并停止执行(它不会导致您的应用程序崩溃)。

我最近得到了一个可怕的教训:它在调试模式下没问题,但在发布版本上表现不同。

答案 4 :(得分:4)

这是最近的更改,在此版本中,它是一个新的lint检查。哪个说,

检查传递给日志记录调用的标记(如果其值可以解析)最多为23个字符(根据Logging API的要求。)

有关详细信息,请阅读以下链接中的第3点。

https://sites.google.com/a/android.com/tools/recent/androidstudio11preview2

如果您不想这样做,请尽量减少TAG中的字符数,并确保它们的长度不超过23。

答案 5 :(得分:2)

解决方案。 2020年版。

build.gradle(应用程序)

android {
    lintOptions {
        disable 'LongLogTag'
    } // put this. 
}

答案 6 :(得分:0)

解释为什么会发生这种情况:

根据AOSP source code ,您可以使用所需的任何标签登录。问题出在Log.isLoggable中。

Log.isLoggable检查系统属性log.tag.<YOUR_TAG>是否启用了要记录的优先级。这是此机制的文档:

  

public static boolean isLoggable (String tag, int level)

     

检查是否可以在指定级别记录指定标签的日志。任何标签的默认级别都设置为INFO。这意味着将记录高于或包括INFO的任何级别。在调用记录方法之前,应检查是否应记录标签。您可以通过设置系统属性:'setprop log.tag来更改默认级别。 '级别为VERBOSE,DEBUG,INFO,WARN,ERROR,ASSERT或SUPPRESS。 SUPPRESS将关闭标签的所有日志记录。您还可以创建一个其中包含以下内容的local.prop文件:'log.tag。='并将其放置在/data/local.prop中。

来源:https://developer.android.com/reference/android/util/Log#isLoggable(java.lang.String,%20int)

在API 26(Oreo)以下,系统属性键的限制为31个字符。 "log.tag.".length() + 23等于31。如果您在Android Oreo下方调用Log.isLoggable,且标签长于23个字符,则会抛出该标签,如in the source code所述。从Android O开始,此限制不再适用。

存在Lint规则只是为了保护您免受所有这些(通常)不必要的细节的侵害。


Log.isLoggable的文档还指出,由于API 24(根据我的发现,这是错误的),将不会抛出IllegalArgumentException。跟随:https://issuetracker.google.com/issues/124593220

答案 7 :(得分:0)

这个错误是为我的一个node_module库抛出的,抱怨有一个单独的node_mode库。

我在该node_module库的build gradle文件中添加了该lint options属性。

  android {
      lintOptions {
          abortOnError false
      }
  }

该库是aws-amplify推送通知。

错误: Execution failed for task ':@aws-amplify/pushnotification:lint'

文件已更新: node_modules/@aws-amplify/pushnotification/android/build.gradle