Android 终于知道Log显示不全的原因了

本文探讨了Android系统中Logcat的日志长度限制问题,介绍了单条日志的最大长度为4096字符,并提供了一种解决方案来处理过长的日志信息,即通过分段打印的方式确保完整信息得以记录。

一个优秀的软件系统一定会实时保存系统运行过程中产生的异常或非异常性数据,用于记录系统运行过程产生的各种行为,作为日后发现问题、跟踪问题并解决问题的一个很重要的依据。一般以输出文件的形式保存,同时也可以选择性的在控台打印。日志处理,可谓是任何软件开发过程中必不可少的一个环节。

在Android应用开发阶段,我们常常会使用系统提供的日志打印功能选择性地在Logcat控制台上打印一些数据信息,便于更加直观地调试跟踪应用运行的一个状态,常见如客户端与服务器通讯过程中涉及到的URL链接、request请求参数和response响应结果等。

但如果打印的message过长,比如接口响应结果过大,将会导致Logcat控台数据显示不全。自打使用Log以来经常遇到这个问题,之前也是没太在意,毕竟message太长的情况也是少见,偶尔遇到这种情况就通过Debug工具跟踪调试,复制对应response信息到bejson等其他辅助工具上格式化浏览,多少还是有点不方便。

后来经过查询才得知,Android系统的单条日志打印长度是有限的,在底层Logger驱动程序的一个类Logger.h头文件中有如下两行代码:

#define LOGGER_ENTRY_MAX_LEN        (4*1024)  
#define LOGGER_ENTRY_MAX_PAYLOAD    \\  
    (LOGGER_ENTRY_MAX_LEN - sizeof(struct logger_entry))  

可以看出,系统显示单条Log信息的长度是固定的,为4*1024个字符长度!Logcat使用的liblog资源包也提到,使用Log打印的message有可能被log内核驱动缩短:

The message may have been truncated by the kernel log driver.

了解了其中的长度限制,就好办了。我们可以对Message做个长度判断,采取分段打印的办法输出日志信息,比如这样做:

if(xml.length() > 4000) {
 for(int i=0;i<xml.length();i+=4000){
    if(i+4000<xml.length())
        Log.i("rescounter"+i,xml.substring(i, i+4000));
     else
        Log.i("rescounter"+i,xml.substring(i, xml.length()));
    }
} else
    Log.i("resinfo",xml);
}

参考地址:

Android Studio 中遇到 **“Log: on XXX”** 显示日志的问题,通常是由于以下原因导致的。你可以根据具体情况逐一排查: --- ### ✅ 1. **检查 Logcat 窗口是否开启** - 确保你已经打开了 Logcat 窗口: - 菜单栏:`View` → `Tool Windows` → `Logcat` - 或者使用快捷键 `Alt + 6`(Windows/Linux)或 `Command + 6`(Mac) --- ### ✅ 2. **选择正确的设备和应用进程** - Android Studio 支持多设备调试,如果未选择正确的设备或应用进程,Logcat 就显示日志。 - 在 Logcat 窗口的顶部: - 左边下拉菜单选择目标设备(如:Pixel 5 API 30) - 右边下拉菜单选择你的应用包名(如:com.example.myapp) --- ### ✅ 3. **检查过滤器设置** - Logcat 提供了多种过滤方式,可能你误设置了过滤器导致日志被隐藏。 - 可尝试: - 清除过滤器内容 - 设置为 `No Filters` 或选择 `Edit Filter Configuration` 自定义过滤 --- ### ✅ 4. **确保代码中正确使用 Log 输出** - 检查是否正确使用 `Log.d()`, `Log.e()` 等方法输出日志: ```java import android.util.Log; public class MainActivity extends AppCompatActivity { private static final String TAG = "MainActivity"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Log.d(TAG, "onCreate: Activity created"); } } ``` --- ### ✅ 5. **重启 Logcat 或 Android Studio** - 有时 Logcat 会出现卡顿或无响应的情况,可以点击 Logcat 右上角的 **Restart** 按钮(🔄图标)重新加载。 - 如果无效,尝试重启 Android Studio。 --- ### ✅ 6. **检查设备连接状态** - 确保设备已正确连接并处于开发者模式。 - 可通过命令行检查设备是否识别: ```bash adb devices ``` - 如果设备未列出,可能是 USB 调试未启用或驱动问题。 --- ### ✅ 7. **检查应用是否处于调试模式** - 如果你是通过 `Run`(Shift + F10)运行的应用,通常会自动进入调试模式。 - 如果是 `Build` 后安装的 APK,可能没有调试权限,无法输出 Log。 --- ### ✅ 8. **查看是否被 ProGuard 或 R8 移除日志** 如果你使用了 ProGuard 或 R8 做代码混淆或优化,可能 Log 被移除了。可以在 `proguard-rules.pro` 中添加以下代码保留日志输出: ```proguard -assumenosideeffects class android.util.Log { public static int d(...); public static int v(...); public static int i(...); public static int w(...); public static int e(...); } ``` --- ### ✅ 9. **使用终端查看 Logcat** 如果 Android Studio 的界面仍无法显示日志,可以使用 ADB 命令查看: ```bash adb logcat ``` 也可以结合包名过滤: ```bash adb logcat -s "MainActivity" ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值