android中log知识总结

2023-11-15

android中的log有很多级别,合理的控制log可以提高的解决问题的效率,减少工作量
1. log输出级别
android中的log级别如下

    ANDROID_LOG_UNKNOWN,
    ANDROID_LOG_DEFAULT,   
    ANDROID_LOG_VERBOSE,
    ANDROID_LOG_DEBUG,
    ANDROID_LOG_INFO,
    ANDROID_LOG_WARN,
    ANDROID_LOG_ERROR,
    ANDROID_LOG_FATAL,
    ANDROID_LOG_SILENT,

2. log所在的文件
java中Log.java所对应的源码路径

  • frameworks/base/core/java/android/util/Log.java

使用时只需导入该Log类,如:
import android.util.Log;

native中log文件对应的源码路径

  • system/core/include/utils/Log.h
  • system/core/include/cutils/log.h
  • system/core/include/log/log.h

以上三个头文件依次include(包含)关系,使用时#include


3. log的级别说明

  • Verbose: 开发调试过程中一些详细信息,不应该编译进产品中,只在开发阶段使用。(参考api文档的描述:Verbose should never be compiled into anapplication except during development)
  • Debug: 用于调试的信息,编译进产品,但可以在运行时关闭。(参考api文档描述:Debug logs are compiled in but stripped atruntime)
  • Info:例如一些运行时的状态信息,这些状态信息在出现问题的时候能提供帮助。
  • Warn:警告系统出现了异常,即将出现错误。
  • Error:系统已经出现了错误。

Info、Warn、Error这三个等级的Log的警示作用依次提高,需要一直保留。这些信息在系统异常时能提供有价值的分析线索。
VERBOSE DEBUG信息应当只存在于开发中,INFO,WARN,ERROR这三种log将出现在发布版本中。

4. native中打印控制
在system/core/include/log/log.h文件中有如下代码

 #ifndef LOG_NDEBUG
 #ifdef NDEBUG
 #define LOG_NDEBUG 1
 #else
 #define LOG_NDEBUG 0
 #endif
 #endif

以上宏定义的意思不解析,不明白可以baidu
通常在使用之前要在文件头加上如下代码来在打印中输入对就模块

#ifndef LOG_TAG
#define LOG_TAG ""
#endif

Android的编译参数中,加入了-DNDEBUG,也就是默认是no debug的,

当然还需要LOG_NDEBUG LOG_NIDEBUG LOG_NDDEBUG这三个宏设置。
当-DNDEBUG被打上后,默认ALOGV会被禁止。
LOG_NDEBUG

LOG_NIDEBUG

LOG_NDDEBUG

这三个宏控制 LOG_PRI(priority, tag, ...)

NDEBUG 是总开关,默认在编译参数中加入,如果要控制打印级别,如下:
打开ALOGV:   #define LOG_NDEBUG 0      //允许Verbose级别打印
打开ALOGI:  #define LOG_NIDEBUG 0     //允许Info级别打印
打开ALOGD:#define LOG_NDDEBUG 0    //允许Debug级别打印
打开全部LOG:#undef NDEBUG    //允许所有级别打印

5. 在native中自定义log函数
第一步:在对应的mk文件中加入:LOCAL_LDLIBS := -llog
第二步:在要使用LOG的cpp文件中加入:
#include //
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, fmt, __VA_ARGS__)
第三步:这样就可以使用了:LOGD("调试信息^_^"); 这样,在logcat端看到的输出是:D/keymatch( 32):我要看到的调试信息^_^ 如果想改变输出中的各项内容,可以参考相应颜色的标示,比如,如果想定义LOGE,就可以把上面的ANDROID_LOG_DEBUG改成ANDROID_LOG_ERROR,同理,LOGI神马的也都以此类推:

#define LOGV(...) __android_log_print(ANDROID_LOG_VERBOSE, "ProjectName", __VA_ARGS__)
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG , "ProjectName", __VA_ARGS__)
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO  , "ProjectName", __VA_ARGS__)
#define LOGW(...) __android_log_print(ANDROID_LOG_WARN  , "ProjectName", __VA_ARGS__)
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR  , "ProjectName", __VA_ARGS__)

fmt:格式化字符串可以指定log格式

6. c++中的预定义宏
__LINE__: 当前源文件的行号,整数
__FILE__: 当前源文件名,char 字符串,使用 /FC 选项产生全路径
__DATE__: 当前编译日期,char 字符串,格式 Aug 28 2011
__TIME__: 当前编译时间,char 字符串,格式 06:43:59
__STDC__: 整数 1,表示兼容 ANSI/ISO C 标准,配合 #if 使用
__TIMESTAMP__: 最后一次修改当前文件的时间戳,char 字符串,格式 Sun Aug 28 06:43:57 2011
__cplusplus: 以 C++ 方式而非 C 语言方式编译时定义,VC 2005 中定义为 199711L,配合 #ifdef 使用
__VA_ARGS__: 在函数式宏中,代表变长部分参数 (...),参考 MSDN: Variadic Macros
__COUNTER__: include 展开编译单元后,编译时第一次遇到 __COUNTER__ 替换为 0,以后在这个编译每遇到一次 __COUNTER__ 自增一。不同的编译单元之间 __COUNTER__ 不互相积累叠加,均从 0 开始计数,但预编译头 .pch 文件会记录 __COUNTER__ 的历史值,则每个编译单元均从历史值 + 1 开始计数。__COUNTER__ 支持宏的嵌套展开
__FUNCTION__, __FUNCDNAME__, __FUNCSIG__: 表示所在函数的函数名的 char 字符串。例如,对于 void test_funcname_macro() 函数原型,它们的值如下:

(1). __FUNCTION__ = test_funcname_macro: 函数的原始名/非修饰名 (undecorated)
(2). __FUNCDNAME__ = ?test_funcname_macro@@YAXXZ: 函数的修饰名 (decorated),可用工具 undname "decorated_name" 得出函数原型和调用规范,即 __FUNCSIG__ 所表示的
(3). __FUNCSIG__ = void __cdecl test_funcname_macro(void): 函数的 signature 名,即调用约定、返回值类型、参数类型

7. 以下是我自定义log函数
#define LOGD(...) \
    __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, "[%s,%s,%d]:%s", __FILE__, __FUNCTION__, __LINE__, ##__VA_ARGS__)

转自:http://blog.sina.com.cn/s/blog_8acf1be10102vqv5.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

android中log知识总结 的相关文章

  • 使用workmanager时Firestore脱机持久性错误

    我正在使用一个WorkManger定期从我的中检索信息Firestore当应用程序处于后台和前台时的数据库 此信息用于根据状态更新 UI 因此不同的状态会添加或删除 UI 的不同部分 第一次运行时效果很好 但是 一旦应用程序处于后台并且Wo
  • StrictMode 策略违规:我的应用程序中存在 android.os.strictmode.LeakedClosableViolation?

    Android 开发新手 第一次在我的应用程序上尝试 StrictMode 我注意到以下内容 并想知道这是否是我的应用程序或库中的问题 我不太清楚 谢谢你 D StrictMode StrictMode policy violation a
  • 如何重试已消耗的 Observable?

    我正在尝试重新执行失败的已定义可观察对象 一起使用 Retrofit2 和 RxJava2 我想在单击按钮时重试特定请求及其订阅和行为 那可能吗 service excecuteLoginService url tokenModel Ret
  • android中向sqlite中插入大量数据

    目前 我必须一次向我的 Android 中插入超过 100 亿条数据 然而 内存不足的问题会使程序崩溃 sqlite 插入测试非常简单 只需使用 for 循环生成 sql 插入命令并通过 开始 和 提交 进行包装 private Array
  • 在 Android Studio 中,为什么我必须在模拟器中单击“运行应用程序”两次才能启动应用程序?

    在 Android Studio 中 当我按播放按钮在 Android 模拟器上安装并运行应用程序时 大约 5 10 秒后 我在屏幕底部收到一条消息 显示 安装成功 但应用程序实际上并未运行在模拟器上 我必须再次按下播放按钮 这是非常令人沮
  • 卸载后 Web 应用程序不显示“添加到主屏幕”

    这是我第一次创建网络应用程序 我设法解决了这个问题 所以我得到了实际的 chrome 提示 将其添加到主屏幕 然后我从手机上卸载了该网络应用程序 因为我想将其展示给我的同事 但是 屏幕上不再出现提示 问题 这是有意为之的行为还是我的应用程序
  • SearchView过滤ListView

    我已经实现了搜索视图来过滤我的列表视图项目 当我输入任何文本时 它会过滤列表 但当我退出搜索视图时 它不会返回原始列表项 public class PlacesListAdapter extends ArrayAdapter
  • Android 后退按钮无法与 Flutter 选项卡内的导航器配合使用

    我需要在每个选项卡内有一个导航器 因此当我推送新的小部件时 选项卡栏会保留在屏幕上 代码运行得很好 但是 android 后退按钮正在关闭应用程序而不是运行 Navigator pop import package flutter mate
  • java.lang.NoClassDefFoundError:org.apache.batik.dom.svg.SVGDOMImplementation

    我在链接到我的 Android LibGDX 项目的 Apache Batik 库时遇到了奇怪的问题 但让我们从头开始 在 IntelliJ Idea 中我有一个项目 其中包含三个模块 Main Android 和 Desktop 我强调的
  • CollapsingToolBarLayout - 状态栏稀松布颜色不改变

    几天前我更新了我的 android studio 并开始使用 CoordinatorLayout 和 CollapsingToolbarLayout 只是尝试一些东西 工具栏稀松布颜色似乎覆盖了状态栏初始颜色和状态栏稀松布颜色 从 xml
  • 在 java 类和 android 活动之间传输时音频不清晰

    我有一个android活动 它连接到一个java类并以套接字的形式向它发送数据包 该类接收声音数据包并将它们扔到 PC 扬声器 该代码运行良好 但在 PC 扬声器中播放声音时会出现持续的抖动 中断 安卓活动 public class Sen
  • 带有 EditText 和 Spinner 的对话框

    我有一个按钮 单击后会弹出一个对话框 我希望对话框有一个EditText and a Spinner对话框内 我不知道如何设置它的视图 我有一个代码AlertDialog它有效 只是EditText and Spinner我需要将其放入其中
  • 无法访问 com.google.android.gms.internal.zzbfm 的 zzbfm 类文件未找到

    我正在将我的 Android 应用程序项目从GCM to FCM 为此 我使用 Android Studio 中的 Firebase 助手工具 并遵循 Google 开发人员指南中的说明 一切都很顺利 并将我的应用程序代码更改为FCM根据助
  • Android:捕获的图像未显示在图库中(媒体扫描仪意图不起作用)

    我遇到以下问题 我正在开发一个应用程序 用户可以在其中拍照 附加到帖子中 并将图片保存到外部存储中 我希望这张照片也显示在图片库中 并且我正在使用媒体扫描仪意图 但它似乎不起作用 我在编写代码时遵循官方的Android开发人员指南 所以我不
  • 在gradle插件中获取应用程序变体的包名称

    我正在构建一个 gradle 插件 为每个应用程序变体添加一个新任务 此新任务需要应用程序变体的包名称 这是我当前的代码 它停止使用最新版本的 android gradle 插件 private String getPackageName
  • 原色(有时)变得透明

    我正在使用最新的 SDK 版本 API 21 和支持库 21 0 2 进行开发 并且在尝试实施新的材料设计指南时遇到了麻烦 材料设计说我需要有我的primary color and my accent color并将它们应用到我的应用程序上
  • 如何在PreferenceActivity中添加工具栏

    我已经使用首选项创建了应用程序设置 但我注意到 我的 PreferenceActivity 中没有工具栏 如何将工具栏添加到我的 PreferenceActivity 中 My code 我的 pref xml
  • 尝试在 ubuntu 中编译 android 内核时出错

    我正在尝试从源代码编译 Android 内核 并且我已经下载了所有正确的软件包来执行此操作 但由于某种原因我收到此错误 arm linux androideabi gcc error unrecognized command line op
  • Android访问远程SQL数据库

    我可以直接从 Android 程序访问远程 SQL 数据库 在网络服务器上 吗 即简单地打开包含所有必需参数的连接 然后执行 SQL 查询 这是一个私人程序 不对公众开放 仅在指定的手机上可用 因此我不担心第三方获得数据库访问权限 如果是这
  • 我的设备突然没有显示在“Android 设备选择器”中

    我正在使用我的三星 Galaxy3 设备来测试过去两个月的应用程序 它运行良好 但从今天早上开始 当我将设备连接到系统时 它突然没有显示在 Android 设备选择器 窗口中 我检查过 USB 调试模式仅在我的设备中处于选中状态 谁能猜出问

随机推荐

  • The centre of polygon (多边形重心)

    描述 Given a polygon your task is to find the centre of gravity for the given polygon 输入 The input consists of T test case
  • cocos2dx 3.x win7+VS2012开发环境搭建及HelloWorld

    1 准备工作 1 VS2012 2 cocos2dx cn cocos2d x org download 3 python 新版本的cocos2dx 需要python编译 2 安装软件 1 VS2012 从官网下载并安装 2 python
  • STL 容器List

    List节点结构 template
  • BAPI_ACC_DOCUMENT_POST 增强

    使用 BAPI ACC DOCUMENT POST 的时候 如果有些字段在 Tables 参数中没有 比如 现在大家都用 Reason code 来作为现金流量表的实现方案 但 BAPI ACC DOCUMENT POST 的 accoun
  • MRI原理与CEST相关简介

    一 MRI相关 1 MRI 2 磁共振成像的物理学原理 3 磁共振成像仪相关 4 磁共振成像脉冲序列 1 MRI 核磁共振成像MRI Magnetic Reasonance Imaging 是利用利用磁共振的物理原理 来对人体内部结构成像的
  • 面试题创作0001,请解释mmap的细节

    1 请列举Linux的几种ICP工具 2 重解释共享内存的实现原理 3 两个进程A和B共享到的同一页物理内存 如果被A进程勾进CPU的Cache 那么B进程访问这段内存数据时 将会从内存中访问 还是从Cache中访问呢 可以X86为例 或其
  • 串扰的耦合途径

    虽然说串扰是电磁场的耦合 但是使用电容与电感就可以理解他 我们都知道两个导体会构成一个电容 当电容两端的电压发生变化时 会有电流从电容中流过 这个电容耦合不止发生在我们的信号线与信号线之间 同时也发生在信号线与回流平面之间 让我们来看一下下
  • Java POI 百万规模数据的导入和导出

    目录 1 百万数据导入 1 1 需求分析 1 2 思路分析 1 3 代码实现 1 3 1 步骤分析 1 3 2 自定义处理器 1 3 3 自定义解析 1 3 4 测试 2 百万数据导出 2 1 概述 2 2 解决方案分析 2 3 原理分析
  • leetcode 167 -双指针

    1 题目 给定一个已按照升序排列 的有序数组 找到两个数使得它们相加之和等于目标数 函数应该返回这两个下标值 index1 和 index2 其中 index1 必须小于 index2 说明 返回的下标值 index1 和 index2 不
  • 开启mysql 3306端口远程访问,并且允许数据库用户远程登录,使用navicat来去登录数据库用户,操作步骤配截图。

    1 首先选择开始菜单进到控制面板 然后选择windows防火墙 2 然后选择高级设置选项 3 选择入站规则 4 新建规则 5 选择端口 单击下一步 6 输入端口3306 单击下一步 7 下一步 8 点击下一步 9 这时候 入站规则里已经有显
  • 深入理解c语言——‘\0’ ,‘0’, “0” ,0之间的区别

    看来基础还是很重要的 基础不扎实就难以学好c语言 就别说写出高质量的c语言代码了 今天 我就被这个问题折磨的不行了 哈哈 不过现在终于明白了 0 0 0 之间的区别了 困惑和快乐与你分享 首先比较一下 0 和 0 的区别 有一个共同点就是它
  • Win11系统线程异常未处理怎么办?Win11系统线程异常未处理解决方法

    Win11系统线程异常未处理怎么办 相信有很多用户对于这一情况都是十分头疼的 大家不要着急 我们可以具体问题具体分析 使用不同的方法解决这个问题 更多系统教程尽在小白系统重装官网 我们认为有必要先了解导致System Thread Exce
  • unity人物换装

    unity人物换装 人物换装算是游戏中的老梗了 为了美化游戏 为获取更好的游戏体验 很多游戏中可以实现人物换装 还可以给人物更换武器 还要翅膀什么的 总之 能在玩家在体验上 带来很好的效果 先看下效果图 这个就把一个人物的形象稍微改变了下
  • flutter 自定义TabBar,实现 高度 和 标题与图标距离 可自定义的方案与实践

    TabBar 是基本每个App都会使用到的一个控件 在官方内置的 TabBar 的高度只有两种规格且是不可修改的 未设置 Icon 时的高度 const double kTabHeight 46 0 设置 Icon 之后的高度 const
  • Springboot + mybatis-plus 报错 java.nio.file.AccessDeniedException

    记录一次 java nio file AccessDeniedException的解决 先看我的报错信息 Caused by java nio file AccessDeniedException D WorkSpace Java IDEA
  • Unity+Vuforia+Window10打包 PC

    前言 本文参考 http blog csdn net htwzl article details 77488886 实测哦 Vuforia SDK是一个常用的增强现实软件开发工具 其跟踪效果稳定 使用简便 受到大众的喜爱 但是以前的Vufo
  • CentOS 6.4下编译安装MySQL 5.6.14

    概述 CentOS 6 4下通过yum安装的MySQL是5 1版的 比较老 所以就想通过源代码安装高版本的5 6 14 正文 一 卸载旧版本 使用下面的命令检查是否安装有MySQL Server rpm qa grep mysql 有的话通
  • 在CentOS 7中安装PHP5和PHP7需要的插件

    安装插件预防安装过程遇见问题 yum install openssl openssl devel bzip2 devel libjpeg devel libpng devel libmcrypt devel fretype freetype
  • python 人民币数字转汉字大写金额

    写了那么久的博客 始于Python爬虫 目前专于Java学习 终于有了属于自己的小窝 欢迎各位访问我的个人网站 未来我们一起交流进步 背景 银行在打印票据的时候 常常需要将阿拉伯数字表示的人民币金额转换为大写表示 现在请你来完成这样一个程序
  • android中log知识总结

    android中的log有很多级别 合理的控制log可以提高的解决问题的效率 减少工作量1 log输出级别 android中的log级别如下 ANDROID LOG UNKNOWN ANDROID LOG DEFAULT ANDROID L