这几天一直在做Android 端测试,经常需要使用adb,经常需要查看log。今天就来单纯的就讲一讲logcat的使用方法。

直接进入主题。

adb logcat 命令格式 : adb logcat [选项] [过滤项]

其中 选项 和 过滤项 在 中括号 [] 中, 说明这是可选的;

adb logcat -v time >C:\Users\z\Desktop\log.txt

解析:-- "-v"选项 : 设置日志的输出格式, 注意只能设置一项;以时间的格式将log输出在桌面。

adb logcat -s System.out

输出指定标签内容 : 

-- "-s"选项 : 设置默认的过滤器, 如 我们想要输出 "System.out" 标签的信息, 就可以使用 adb logcat -s System.out


[plain]  ​​view plain​​​ ​​​copy​





    1. octopus@octopus:~$ adb logcat -s System.out
    2. --------- beginning of /dev/log/system
    3. --------- beginning of /dev/log/main
    4. I/System.out(22930): GSM -91
    5. I/System.out(22930): SignalStrength issssssssss : -91
    6. I/System.out(22930): GSM -91
    7. I/System.out(22930): SignalStrength issssssssss : -91
    8. I/System.out(22930): Supervisor Thread
    9. I/System.out(22930): Got run mode


    adb logcat -c 

    清空日志缓存信息

    adb logcat -d

    将缓存日志输出 : 使用 adb logcat -d 命令, 输出命令, 之后推出命令, 不会进行阻塞;

    adb logcat -t 5

    输出最近的日志 : 使用 adb logcat -t 5 命令, 可以输出最近的5行日志, 并且不会阻塞

    (2) 过滤项解析

    过滤项格式 : <tag>[:priority] , 标签:日志等级, 默认的日志过滤项是 " *:I " ;

    -- V : Verbose (明细);

    -- D : Debug (调试);

    -- I : Info (信息);

    -- W : Warn (警告);

    -- E : Error (错误);

    -- F : Fatal (严重错误);

    -- S : Silent(Super all output) (最高的优先级, 可能不会记载东西);

    过滤指定等级日志 : 使用 adb logcat 10 *:E 命令, 显示 Error 以上级别的日志;


    [plain]  ​​view plain​​​ ​​​copy​




    1. octopus@octopus:~$ adb logcat *:E
    2.
    3. Note: log switch off, only log_main and log_events will have logs!
    4. --------- beginning of /dev/log/main
    5. E/WifiHW ( 441): wifi_send_command : SCAN_RESULTS ; interface index=0;
    6. E/WifiHW ( 441): wifi_send_command : AP_SCAN 1 ; interface index=0;
    7. E/WifiHW ( 441): wifi_send_command : SCAN_RESULTS ; interface index=0;
    8. E/dalvikvm( 756): GC_CONCURRENT freed 1809K, 27% free 19489K/26695K, paused 16ms+5ms, total 109ms
    9. E/WifiHW ( 441): wifi_send_command : SCAN ; interface index=0;
    10. E/WifiHW ( 441): wifi_send_command : AP_SCAN 1 ; interface index=0;
    11. E/WifiHW ( 441): wifi_send_command : SCAN_RESULTS ; interface index=0;
    12. E/dalvikvm( 756): GC_CONCURRENT freed 1820K, 27% free 19490K/26695K, paused 16ms+3ms, total 102ms
    13. E/WifiHW ( 441): wifi_send_command : AP_SCAN 1 ; interface index=0;
    14. E/WifiHW ( 441): wifi_send_command : SCAN_RESULTS ; interface index=0;

    过滤指定标签等级日志 : 使用 adb logcat WifiHW:D *:S 命令进行过滤;

    -- 命令含义 : 输出10条日志, 日志是 标签为 WifiHW, 并且优先级 Debug(调试) 等级以上的级别的日志;

    -- 注意 *:S : 如果没有 *S 就会输出错误;

    octopus@octopus:~$ adb logcat WifiHW:D *:S  

    Note: log switch off, only log_main and log_events will have logs!
    --------- beginning of /dev/log/main
    E/WifiHW ( 441): wifi_send_command : SCAN_RESULTS ; interface index=0;
    E/WifiHW ( 441): wifi_send_command : AP_SCAN 1 ; interface index=0;
    E/WifiHW ( 441): wifi_send_command : SCAN_RESULTS ; interface index=0;
    E/WifiHW ( 441): wifi_send_command : AP_SCAN 1 ; interface index=0;
    E/WifiHW ( 441): wifi_send_command : SCAN_RESULTS ; interface index=0;
    E/WifiHW ( 441): wifi_send_command : AP_SCAN 1 ; interface index=0;
    E/WifiHW ( 441): wifi_send_command : SCAN_RESULTS ; interface index=0;

    可以同时设置多个过滤器 : 使用 adb logcat WifiHW:D dalvikvm:I *:S 命令, 输出 WifiHW 标签 的 Debug 以上级别 和 dalvikvm 标签的 Info 以上级别的日志;

    octopus@octopus:~$ adb logcat WifiHW:D dalvikvm:I *:S   

    Note: log switch off, only log_main and log_events will have logs!
    --------- beginning of /dev/log/main
    E/WifiHW ( 441): wifi_send_command : AP_SCAN 1 ; interface index=0;
    E/WifiHW ( 441): wifi_send_command : SCAN_RESULTS ; interface index=0;
    E/dalvikvm( 756): GC_CONCURRENT freed 1820K, 27% free 19490K/26695K, paused 17ms+2ms, total 110ms
    E/WifiHW ( 441): wifi_send_command : AP_SCAN 1 ; interface index=0;
    E/WifiHW ( 441): wifi_send_command : SCAN_RESULTS ; interface index=0;
    E/WifiHW ( 441): wifi_send_command : AP_SCAN 1 ; interface index=0;
    E/WifiHW ( 441): wifi_send_command : SCAN_RESULTS ; interface index=0;
    E/dalvikvm( 756): GC_CONCURRENT freed 1810K, 27% free 19489K/26695K, paused 17ms+5ms, total 108ms
    E/WifiHW ( 441): wifi_send_command : AP_SCAN 1 ; interface index=0;
    E/WifiHW ( 441): wifi_send_command : SCAN_RESULTS ; interface index=0;

    2. 使用管道过滤日志

    (1) 过滤固定字符串

    过滤固定字符串 : 只要命令行出现的日志都可以过滤, 不管是不是标签;

    -- 命令 : 

    adb logcat | grep Wifi 
    octopus@octopus:~$ adb logcat | grep Wifi  
    E/WifiHW ( 441): wifi_send_command : AP_SCAN 1 ; interface index=0;
    E/WifiHW ( 441): wifi_send_command : SCAN_RESULTS ; interface index=0;
    E/WifiHW ( 441): wifi_send_command : SCAN ; interface index=0;
    E/WifiHW ( 441): wifi_send_command : AP_SCAN 1 ; interface index=0;
    E/WifiHW ( 441): wifi_send_command : SCAN_RESULTS ; interface index=0;
    E/WifiHW ( 441): wifi_send_command : AP_SCAN 1 ; interface index=0;
    E/WifiHW ( 441): wifi_send_command : SCAN_RESULTS ; interface index=0;

    adb logcat实用命令讲解_apache

    过滤字符串忽略大小写 : 

    adb logcat | grep -i wifi 

    adb logcat实用命令讲解_正则表达式_02

    (2) 使用正则表达式匹配

    分析日志 : 该日志开头两个字符是 "V/", 后面开始就是标签, 写一个正则表达式 "^..ActivityManager", 就可以匹配日志中的 "V/ActivityManager" 字符串;


    [plain]  ​​view plain​​​ ​​​copy​





    1. V/ActivityManager(  574): getTasks: max=1, flags=0, receiver=null


    正则表达式过滤日志 : 使用上面的正则表达式组成命令 

    adb logcat | grep "^..Activity" 

    adb logcat实用命令讲解_sed_03