做android有些日子了,只是对主要的logcat的具体使用方法还是非常模糊,今天有空,学习一下。

logcat能够在adb中使用,也能够直接在命令行下使用。
 
logcat [options] [filterspecs]
logcat的选项包含:
  -s                      默认设置过滤器,如指定'*:s'.
  -f <filename>    输出到文件,默认情况是标准输出.
  -r [<kbytes>]    循环log的字节数(默觉得16),须要-f.
  -n <count>       设置循环log的最大数目,默认是4
  -v <format>      设置log的打印格式,  <format> 是以下的一种:
                            brief process tag thread raw time threadtime long.
  -c                      清除全部log并退出.
  -d                     得到全部log并退出 (不堵塞).
  -g                     得到环形缓冲区的大小并退出.
  -b <buffer>      请求不同的环形缓冲区('main' (默认), 'radio', 'events').
  -B                     输出log到二进制中.

1.  日志过滤器设置
  每个输出的Android日志信息都有一个标签和它的优先级.
  日志的标签是系统部件原始信息的一个简要的标志。(比方:“View”就是查看系统log的标签,“RFID_HAL”就是查看RFID的HAL层log的标签)。
  优先级有下列集中,是依照从低到高顺利排列的:
  V — Verbose (lowest priority)
  D — Debug
  I — Info
  W — Warning
  E — Error
  F — Fatal
  S — Silent (highest priority, on which nothing is ever printed)无log打印

在执行logcat的时候在前两列的信息中你就能够看到 logcat 的标签列表和优先级别,它是这样标出的:<priority>/<tag>.
  以下是一个logcat输出的样例,它的优先级就似乎I,标签就是ActivityManage:
  I/ActivityManager(  585): Starting activity: Intent { action=android.intent.action...}
  
  过滤器语句依照以下的格式描写叙述:tag:priority, tag 表示是标签,priority是表示标签log的最低等级,
  你能够在过滤器中多次写tag:priority。
  
  比如:adb logcat ActivityManager:I MyApp:D *:S  或者 adb logcat -s ActivityManager:I MyApp:D
  上面表达式的最后的元素 *:S ,,是设置全部的标签为”silent”,全部日志仅仅显示有”ActivityManager”和“MyApp”的,用 *:S 的还有一个用处是能够确保日志输出的时候是依照过滤器的说明限制的,也让过滤器也作为一项输出写到日志中。
  
2.  log输出格式设置
  能够改动日志的输出格式,所以能够显示出特定的元数据域。能够通过 -v 选项得到格式化输出日志的相关信息。
  
  brief — Display priority/tag and PID of originating process (the default format).
  process — Display PID only.
  tag — Display the priority/tag only.
  thread — Display process:thread and priority/tag only.
  raw — Display the raw log message, with no other metadata fields.
  time — Display the date, invocation time, priority/tag, and PID of the originating process.
  long — Display all metadata fields and separate messages with a blank lines.
  样例:
  brief -- P/tag (876): message  (默认格式)
  process -- (876): message
  tag -- P/tag: message
  thread -- P/tag( 876:0x37c) message
  raw -- message
  time -- 09-08 05:40:26.729 P/tag ( 876): message
  threadtime -- 09-08 05:40:26.729 876 892 P/tag : message
  long -- [ 09-08 05:40:26.729 876:0x37c P/tag ] message

3.  查看可用日志缓冲区
  Android日志系统有循环缓冲区,并非全部的日志系统都有默认循环缓冲区。
  [adb] logcat [-b <buffer>]
  radio —  查看和radio telephony相关的缓冲区
  events —  查看和事件相关的的缓冲区
  main —   查看基本的日志缓冲区
  
4. log源代码头文件
 4.1 java
   其实LogCat的功能是由Android的类android.util.Log决定的,在程序中log的用法例如以下所看到的:
   Log.v() -------------------- VERBOSE
   Log.d() -------------------- DEBUG
   Log.i() -------------------- INFO
   Log.w() -------------------- WARN
   Log.e() -------------------- ERROR
   以上log的级别依次升高,Debug信息应当仅仅存在于开发中,INFO、 WARN、ERROR这3种log将出如今公布版本号中。

对于Java类,能够声明一个字符串常量TAG,LogCat能够依据它来区分不同的log.
   比如,在计算器(Calculator)的类中,定义例如以下所看到的:
   public class Calculator extends Activity {
   /* ...... */
       private static final String LOG_TAG = "Calculator";
       private static final boolean DEBUG  = false;
       private static final boolean LOG_ENABLED = DEBUG ? Config.LOGD : Config.LOGV;
   /* ...... */
     由此,全部在Calculator中使用的log,均以“Calculator”为开头。
  
  4.2 FW and HAL
     JNI层代码需包括头文件frameworks/base/include/utils/Log.h,实际上这个头文件include了HAL层代码使用的头文件system/core/include/cutils/log.h
     //#define  NDEBUG
     //#define  LOG_NDEBUG  0
     #define  LOG_TAG  "RFID_HAL"
   #include <cutils/log.h>
   
   这里对能够输出Verbose级别的log的设置,逻辑上有点反,实际上在log.h文件開始就有例如以下定义:
   #ifndef LOG_NDEBUG
   #ifdef NDEBUG
   #define LOG_NDEBUG 1
   #else
   #define LOG_NDEBUG 0
   #endif
   #endif
   
   #ifndef LOG_TAG
   #define LOG_TAG NULL
   #endif
   默认情况下,LOG_NDEBUG = 0
   
   以下是和Verbose主要的log相关的宏定义:
   #ifndef LOGV
   #if LOG_NDEBUG
   #define LOGV(...)   ((void)0)
   #else
   #define LOGV(...) ((void)LOG(LOG_VERBOSE, LOG_TAG, __VA_ARGS__))// 仅仅有在为0的情况下这个宏才有意义
   #endif
   #endif
   
   #define CONDITION(cond)     (__builtin_expect((cond)!=0, 0))
   
   #ifndef LOGV_IF
   #if LOG_NDEBUG
   #define LOGV_IF(cond, ...)   ((void)0)
   #else      // 仅仅有在为0的情况下这个宏才有意义
   #define LOGV_IF(cond, ...) /
       ( (CONDITION(cond)) /
       ? ((void)LOG(LOG_VERBOSE, LOG_TAG, __VA_ARGS__)) /
       : (void)0 )
   #endif
   #endif
   
   ...
   #ifndef IF_LOGV
   #if LOG_NDEBUG
   #define IF_LOGV() if (false)
   #else
   #define IF_LOGV() IF_LOG(LOG_VERBOSE, LOG_TAG)
   #endif
   #endif

综上,代码中假设须要打开VERBOSE级别的log,仅仅须要定义#define  LOG_NDEBUG  0或者干脆不要定义;假设须要关闭VERBOSE级别的log,能够定义#define  LOG_NDEBUG  1或者#define  NDEBUG,二者选一就可以。
   
參考文件:
   http://blog.csdn.net/czbever/archive/2010/09/27/5910640.aspx
   http://jiahuhuan.blog.163.com/blog/static/13024124620099179491291/
   http://www.javaeye.com/topic/477112

logcat使用的更多相关文章

  1. Logcat使用总结

    不建议用System.out.println(), 因为使用syso导致日志打印不可控制.打印时间无法确定.不能添加过滤器.日志没有级别区分等为题. Android中的日志工具类是Log(androi ...

  2. 制作bat脚本,抓取Android设备logcat

    ::bat制作抓取Android设备的logcat,并保存以时间命名的txt文件至设备目录 1 @ECHO off adb wait-for-device ECHO 正在连接设备 adb logcat ...

  3. android的logcat详细用法

    Android日志系统提供了记录和查看系统调试信息的功能.日志都是从各种软件和一些系统的缓冲区中记录下来的,缓冲区可以通过 logcat 命 令来查看和使用. 使用logcat命令 你可以用 logc ...

  4. 解决eclipse中logcat不显示log的问题

    调试程序需要打印一些消息出来,logcat不好用的话就很麻烦了.这个问题折腾了好久,为啥就是不出来呢? 上网找了很多解决办法: 重启eclipse 重启adb 重启logcat ......等等好多 ...

  5. Android开发学习——开发调试工具-DDMS应用,ADB进程,Logcat

    DDMS --  Dalvik debug monitor service    调试监控服务 对模拟器进行相关配置. ADB进程   Android debug bridge  建立eclipse和 ...

  6. 关于android的日志输出&LogCat

    android提供了自己的log输出api-->位于android.util.Log这个类中. 这个类比较常用的打印日志的方法有5个,这5个方法都会把日志打印到LogCat中: Log.v(ta ...

  7. Android下读取logcat的信息

    有时我们需要在程序执行进程中遇到一些异常,需要收集一logcat的信息,android下就可以使用以下方法获取: private static String getLogcatInfo(){ Stri ...

  8. Android Studio -修改LogCat的颜色

    Android Studio -修改LogCat的颜色 author:Kang,Leo weibo:http://weibo.com/kangyi 效果图 设置 Preference->Edit ...

  9. logcat 基本使用

    adb logcat -c    //清空以前的日志 adb logcat -v time >  d:/sss.log       //将当前日志输出到d盘的sss.log中  sss.log不 ...

  10. unity游戏在logcat中过滤一些不需要的Log

    adb logcat | grep -v "UnityEngineDebug.cpp\|:\s*$" | grep Unity 意义: 1. grep -v "过滤条件1 ...

随机推荐

  1. GCD多线程 在子线程中获取网络图片 在主线程更新

    子线程中得所有数据都可以直接拿到主线程中使用 //当触摸屏幕的时候,从网络上下载一张图片到控制器的view上显示 -(void)touchesBegan:(NSSet *)touches withEv ...

  2. sqlserver2008附加数据库——错误3415

    权限问题, 在其文件,右击属性>安全>编辑>添加>加一个everyone单击确定>其完全控制, 这样给每个用户权限 ---来自凌波小屋----冯和超笔记-----

  3. 64位操作系统下IIS报“试图加载格式不正确的程序”错误

    缘由:在64位操作系统下IIS发布32位的项目,报“项目依赖的dll无法读取,试图加载格式不正确的程序”错误. 原因:程序集之间的通讯要么全是64位环境下的,要么全是32位环境下的.不能混编访问.不然 ...

  4. 【USACO 2.1.3】三值的排序

    [题目描述] 排序是一种很频繁的计算任务.现在考虑最多只有三值的排序问题.一个实际的例子是,当我们给某项竞赛的优胜者按金银铜牌排序的时候.在这个任务中可能的值只有三种1,2和3.我们用交换的方法把他排 ...

  5. backbone学习笔记(一)

    因为工作的需要,从今天起对backbone的学习过程做下记录. 学习计划: 1.1周看基本知识(2014/1/18-2014/1/25) 2.基本知识总结(2014/1/26) 3.半周按教程写hel ...

  6. Yii2的相关学习记录,后台模板和gii(三)

    前面已经可以正常登录,但我们需要体验下最常用的增删查改的操作.这里就需要gii,通过gii可以方便的生成表单.表格的框架,不需要我们再写重复的东西. gii访问地址:http://localhost/ ...

  7. Python学习笔记:03语法

    Python 语法 Python语法包括: 模块函数导入 赋值 判断循环语句 模块导入 import somemodule somemodule.somefunc from somemodule im ...

  8. KeyPress事件

    在做一个小demo的时候,发现在文本框中输入一个数字,按下“+”,数字增加了,但是“+”仍旧存在的问题,解决方案:提前执行键盘press事件 private void txtNum_KeyPress( ...

  9. uva10561 - Treblecross

    Treblecross is a two player game where the goal is to get three `X' in a row on a one-dimensional bo ...

  10. android.os.NetworkOnMainThreadException 在4.0之后谷歌强制要求连接网络不能在主线程进行访问

    谷歌在4.0系统以后就禁止在主线程中进行网络访问了,原因是: 主线程是负责UI的响应,如果在主线程进行网络访问,超过5秒的话就会引发强制关闭, 所以这种耗时的操作不能放在主线程里.放在子线程里,而子线 ...