2017年2月17日金曜日

android.util.Log に渡す TAG は、23文字以下でなければならない。

初めに結論

android.util.Log に渡す TAG は、23文字以下でなければならない。

もし TAG が23文字より長いと、(少なくとも android.util.Log.isLoggable() では) IllegalArgumentException が送出される。


(付録: 上限23文字を導出する計算式)

MAX_LOG_TAG_LENGTH = PROPERTY_KEY_MAX - sizeof(LOG_NAMESPACE)
                   = PROP_NAME_MAX    - sizeof("log.tag.")
                   = 32               - 9
                   = 23

core/java/android/util/Log.java (217)

public static native boolean isLoggable(String tag, int level);

core/jni/android_util_Log.cpp (62)

if ((strlen(chars)+sizeof(LOG_NAMESPACE)) > PROPERTY_KEY_MAX) {
    char buf2[200];
    snprintf(buf2, sizeof(buf2),
        "Log tag \"%s\" exceeds limit of %zu characters\n",
        chars, PROPERTY_KEY_MAX - sizeof(LOG_NAMESPACE));
    jniThrowException(env, "java/lang/IllegalArgumentException", buf2);

core/jni/android_util_Log.cpp (18)

#define LOG_NAMESPACE "log.tag."

libcutils/include/cutils/properties.h (36)

/* System properties are *small* name value pairs managed by the
** property service.  If your data doesn't fit in the provided
** space it is not appropriate for a system property.
**
** WARNING: system/bionic/include/sys/system_properties.h also defines
**          these, but with different names.  (TODO: fix that)
*/
#define PROPERTY_KEY_MAX   PROP_NAME_MAX

libc/include/sys/system_properties.h (72)

/* Deprecated. In Android O and above, there's no limit on property name length. */
#define PROP_NAME_MAX   32

2017年2月14日火曜日

Android でのロギング、および java.util.logging.Logger と android.util.Log の関係性

まとめ


loggerName から TAG への変換

  • JUL での loggerName は、そのままでは logcat用の TAG としては一般には長すぎる。そこで、dalvik.system.DalvikLoggingloggerNameToTag() で短く切りつめられる。
  • もし、JUL での作法として loggerName に FQCN (パッケージ名付きのクラス名) を指定しているのであれば、たいていの場合、TAG は loggerName の 単純名 (パッケージ名なしのクラス名) になる。
    例: loggerName が com.example.a.MyActivity ならば、TAG は MyActivity になる。
  • ただし、loggerName として指定された FQCN の長さが 23文字以下 ならば、その FQCN が そのまま TAG になる。
  • 逆に、loggerName を 単純名 に置き換えても 23文字に収まらない場合は、単純名の後ろから23文字分が TAG として採用される。

JUL の各ログレベル は、logcat の どの priority に対応するか?

JUL の各ログレベル から logcat の priority への変換は、AndroidHandlergetAndroidLevel() で行われている。

JUL での ログレベルlogcat での priority
SEVERE ERROR
WARNING WARN
INFO INFO
CONFIG DEBUG
FINE, FINER, FINEST VERBOSE