Android中如何手动制造logcat各等级日志(VERBOSE、DEBUG、INFO、WARNING、ERROR、FATAL)

本文最后更新于:2024年7月29日 晚上

1、logcat与log工具

logcat:是Android操作系统中用于记录和查看系统日志的工具。它是Android开发和调试的重要工具之一,能够通过logcat定位诊断系统故障或应用程序的问题。

log:在android中默认集成的一个生成日志的工具,可以通过log指令来生成我们想要的各类logcat日志来方便测试。

2、通过log生成logcat日志

通过adb工具进入到android控制台:

1
2
# emulator-5554为设备名
adb -s emulator-5554 shell

2.1、logcat日志等级

执行logcat –help查看指令说明,可以看到有日志等级,包括六种可以打印的类型(VERBOSE、DEBUG、INFO、WARNING、ERROR、FATAL)。另外一种S(Silent)表示静默,即上面所有类型的日志均不输出。

image-20240727164728108

具体类型说明如下:从上往下等级逐渐升高

  • VERBOSE:最低级别,用于详细的调试信息。
  • DEBUG:用于调试信息,通常在开发过程中使用。
  • INFO:用于普通信息,例如应用程序的运行状态。
  • WARNING:用于警告信息,表明潜在的问题。
  • ERROR:用于错误信息,表示应用程序或系统发生了错误。
  • FATAL:用于表示严重的错误,通常伴随应用程序崩溃。

2.2、log指令说明

执行log --help查看log说明内容:

image-20240727165325663

  • -p:默认打印INFO级别的日志,可以使用-p参数来修改日志级别
  • -t:使用给定标签代替默认的‘log’内容

使用示例:

1
log -p v -t "syslog_test" "ivi----Log level of : VERBOSE"

image-20240727170501263

执行完之后,执行logcat指令打印,即可得到我们指定的日志内容:

1
logcat | grep "syslog_test"

image-20240727170647459

脚本说明:

定义日志等级为Verbose,指定日志TAG标签为“syslog_test”——系统日志测试,并输出具体的消息内容为“ivi—-Log level of : VERBOSE”

log指令使用起来很简单也很方便。那么参照这个用法,可以生成不同等级不同TAG标签的内容。下面给出不同等级的适用实例。

2.3、log生成日志指令

我们先设置一个时间变量TIME,格式化为“年-月-日 时:分:秒”方便检查时间,后续加入到日志的打印中去:

1
TIME=`date +'%Y-%m-%d %H:%M:%S'`
  • 生成VERBOSE,标签TAG为“LOG-TEST-1”:
1
log -p v -t "LOG-TEST-1" "GEN LOG level is : VERBOSE------${TIME}."
  • 生成DEBUG等级,标签TAG为“LOG-TEST-2”:
1
log -p d -t "LOG-TEST-2" "GEN LOG level is : DEBUG--------${TIME}."
  • 生成INFO等级,标签TAG为“LOG-TEST-3”:
1
log -p i -t "LOG-TEST-3" "GEN LOG level is : INFO---------${TIME}."
  • 生成WARNING等级,标签TAG为“LOG-TEST-4”:
1
log -p w -t "LOG-TEST-4" "GEN LOG level is : WARNING------${TIME}."
  • 生成ERROR等级,标签TAG为“LOG-TEST-5”:
1
log -p e -t "LOG-TEST-5" "GEN LOG level is : ERROR--------${TIME}."
  • 生成FATAL等级,标签TAG为“LOG-TEST-6”:
1
log -p f -t "LOG-TEST-6" "GEN LOG level is : FATAL--------${TIME}."

Tips:上面的-p后接的参数,对应与log --help中的说明:

image-20240727172415329

3、制作日志生成shell脚本

在我们知道如何通过log生成单条不同等级和标签的用例后,那么我们接下来要通过这些指令,进行批量造日志了。在shell中使用循环语句来控制日志生成指令:

  • 一组日志生成语句,包含下面这些:
1
2
3
4
5
6
7
TIME=`date +'%Y-%m-%d %H:%M:%S'`
log -p v -t "LOG-TEST-1" "GEN LOG level is : VERBOSE------${TIME}."
log -p d -t "LOG-TEST-2" "GEN LOG level is : DEBUG--------${TIME}."
log -p i -t "LOG-TEST-3" "GEN LOG level is : INFO---------${TIME}."
log -p w -t "LOG-TEST-4" "GEN LOG level is : WARNING------${TIME}."
log -p e -t "LOG-TEST-5" "GEN LOG level is : ERROR--------${TIME}."
log -p f -t "LOG-TEST-6" "GEN LOG level is : FATAL--------${TIME}."
  • shell中的循环控制是这样:
1
2
3
4
while [condition]
do
[sentence]
done

加入日志生成,其中再加入时延控制,usleep 200000间隔200毫秒1组:

1
2
3
4
5
6
7
8
9
10
11
12
TIME=`date +'%Y-%m-%d %H:%M:%S'`
while true
do
TIME=`date +'%Y-%m-%d %H:%M:%S'`
log -p v -t "LOG-TEST-1" "GEN LOG level is : VERBOSE------${TIME}."
log -p d -t "LOG-TEST-2" "GEN LOG level is : DEBUG--------${TIME}."
log -p i -t "LOG-TEST-3" "GEN LOG level is : INFO---------${TIME}."
log -p w -t "LOG-TEST-4" "GEN LOG level is : WARNING------${TIME}."
log -p e -t "LOG-TEST-5" "GEN LOG level is : ERROR--------${TIME}."
log -p f -t "LOG-TEST-6" "GEN LOG level is : FATAL--------${TIME}."
usleep 200000
done

在Android6.0之后,可以通过集成的toybox工具集来使用vi工具,接下来使用vi来创建shell脚本:

1
2
# android控制面板执行
toybox vi /data/genlog.sh

键入i后,输入上面的命令内容,粘贴内容之后输入Esc+:键,之后敲入wq保存并退出编辑。

1
2
# 检查创建的脚本
cat /data/genlog.sh

赋予执行权限:

1
chmod +x genlog.sh

执行/data/genlog.sh开始生成日志,logcat | grep "LOG-TEST"可以看到能够正常批量生成日志:

image-20240729152708049

也可以通过PC本地创建文本文件,再改为bash文件,使用adb push方式进行上传,使用这种方式需要注意下面两个编码问题:

  • 1、我们通过Windows文本编辑器创建的文本内容,其格式默认为CR LF格式,在android设备中使用的unix编码,需要将编码转换为LF格式,否则在执行while、if等语句时会报错:

image-20240729152949367

出现异常时,会报下面的syntax error: unmatched错误:

image-20240729153226333

  • 2、制表符需要转换为空格,虽然不影响运行,但建议转换为空格执行:

image-20240729153355925

4、增加日志生成控制

当我们想在运行时自由选择生成日志的级别,我们可以通过命令行参数传递进行日志级别控制:

脚本基本结构,通过while或if语句控制条件,之后通过传递的shell参数来判断执行哪一段语句。

1、参数传递:使用$n表示第n个参数,其中$0为文件名,$1开始才是接的第一个参数

1
2
3
4
5
6
# 简单示例
# test.sh文件内容
echo "filename is : $0";
echo "the arg1 is : $1";
# 运行
./test.sh key1

image-20240729160345253

参考:https://www.runoob.com/linux/linux-shell-passing-arguments.html

2、补全while条件:

定义日志等级对应数值1-6,另外加所有日志的生成场景,分别对应如下:

1
2
3
4
5
6
7
1 -- VERBOSE
2 -- DEBUG
3 -- INFO
4 -- WARNING
5 -- ERROR
6 -- FATAL
all -- 生成所有级别日志

修改while条件语句:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
TIME=`date +'%Y-%m-%d %H:%M:%S'`
while [ "$1" == '1' ]
do
TIME=`date +'%Y-%m-%d %H:%M:%S'`
log -p v -t "LOG-TEST-1" "GEN LOG level is : VERBOSE------${TIME}."
usleep 200000
done

while [ "$1" == '2' ]
do
TIME=`date +'%Y-%m-%d %H:%M:%S'`
log -p d -t "LOG-TEST-2" "GEN LOG level is : DEBUG--------${TIME}."
usleep 200000
done

while [ "$1" == '3' ]
do
TIME=`date +'%Y-%m-%d %H:%M:%S'`
log -p i -t "LOG-TEST-3" "GEN LOG level is : INFO---------${TIME}."
usleep 200000
done

while [ "$1" == '4' ]
do
TIME=`date +'%Y-%m-%d %H:%M:%S'`
log -p w -t "LOG-TEST-4" "GEN LOG level is : WARNING------${TIME}."
usleep 200000
done

while [ "$1" == '5' ]
do
TIME=`date +'%Y-%m-%d %H:%M:%S'`
log -p e -t "LOG-TEST-5" "GEN LOG level is : ERROR--------${TIME}."
usleep 200000
done

while [ "$1" == '6' ]
do
TIME=`date +'%Y-%m-%d %H:%M:%S'`
log -p f -t "LOG-TEST-6" "GEN LOG level is : FATAL--------${TIME}."
usleep 200000
done

while [ "$1" == 'all' ]
do
TIME=`date +'%Y-%m-%d %H:%M:%S'`
log -p v -t "LOG-TEST-1" "GEN LOG level is : VERBOSE------${TIME}."
log -p d -t "LOG-TEST-2" "GEN LOG level is : DEBUG--------${TIME}."
log -p i -t "LOG-TEST-3" "GEN LOG level is : INFO---------${TIME}."
log -p w -t "LOG-TEST-4" "GEN LOG level is : WARNING------${TIME}."
log -p e -t "LOG-TEST-5" "GEN LOG level is : ERROR--------${TIME}."
log -p f -t "LOG-TEST-6" "GEN LOG level is : FATAL--------${TIME}."
usleep 200000
done

运行一下看看,能够成功的自由选择生成的级别了:

./genlog.sh 1生成Verbose等级日志:

image-20240729162142939

./genlog.sh all生成所有级别日志:

image-20240729162309734

./genlog.sh 3生成Info级别日志:

image-20240729162425242

至此已大工告成,上面的实现方法是将while语句与条件单独拆开进行判断,在shell中也可以使用if或case语句进行多条件判断,详见附录。

5、附录

  • IF多条件结构:
1
2
3
4
5
6
7
if [ condition1 ]; then
# 当 condition1 为真时执行
elif [ condition2 ]; then
# 当 condition2 为真时执行
else
# 当所有条件都不为真时执行
fi

将前面的脚本使用if结构进行修改:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
TIME=`date +'%Y-%m-%d %H:%M:%S'`

if [ "$1" == '1' ]; then
TIME=`date +'%Y-%m-%d %H:%M:%S'`
log -p v -t "LOG-TEST-1" "GEN LOG level is : VERBOSE------${TIME}."
usleep 200000

elif [ "$1" == '2' ]; then
TIME=`date +'%Y-%m-%d %H:%M:%S'`
log -p d -t "LOG-TEST-2" "GEN LOG level is : DEBUG--------${TIME}."
usleep 200000

elif [ "$1" == '3' ]; then
TIME=`date +'%Y-%m-%d %H:%M:%S'`
log -p i -t "LOG-TEST-3" "GEN LOG level is : INFO---------${TIME}."
usleep 200000

elif [ "$1" == '4' ]; then
TIME=`date +'%Y-%m-%d %H:%M:%S'`
log -p w -t "LOG-TEST-4" "GEN LOG level is : WARNING------${TIME}."
usleep 200000

elif [ "$1" == '5' ]; then
TIME=`date +'%Y-%m-%d %H:%M:%S'`
log -p e -t "LOG-TEST-5" "GEN LOG level is : ERROR--------${TIME}."
usleep 200000

elif [ "$1" == '6' ]; then
TIME=`date +'%Y-%m-%d %H:%M:%S'`
log -p f -t "LOG-TEST-6" "GEN LOG level is : FATAL--------${TIME}."
usleep 200000

elif [ "$1" == 'all' ]; then
TIME=`date +'%Y-%m-%d %H:%M:%S'`
log -p v -t "LOG-TEST-1" "GEN LOG level is : VERBOSE------${TIME}."
log -p d -t "LOG-TEST-2" "GEN LOG level is : DEBUG--------${TIME}."
log -p i -t "LOG-TEST-3" "GEN LOG level is : INFO---------${TIME}."
log -p w -t "LOG-TEST-4" "GEN LOG level is : WARNING------${TIME}."
log -p e -t "LOG-TEST-5" "GEN LOG level is : ERROR--------${TIME}."
log -p f -t "LOG-TEST-6" "GEN LOG level is : FATAL--------${TIME}."
usleep 200000

else
TIME=`date +'%Y-%m-%d %H:%M:%S'`
log -p v -t "LOG-TEST-1" "GEN LOG level is : VERBOSE------${TIME}."
log -p d -t "LOG-TEST-2" "GEN LOG level is : DEBUG--------${TIME}."
log -p i -t "LOG-TEST-3" "GEN LOG level is : INFO---------${TIME}."
log -p w -t "LOG-TEST-4" "GEN LOG level is : WARNING------${TIME}."
log -p e -t "LOG-TEST-5" "GEN LOG level is : ERROR--------${TIME}."
log -p f -t "LOG-TEST-6" "GEN LOG level is : FATAL--------${TIME}."
usleep 200000
fi

修改完成,上面是只能打印1次,加入无条件while循环语句:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
TIME=`date +'%Y-%m-%d %H:%M:%S'`

if [ "$1" == '1' ]; then
while true
do
TIME=`date +'%Y-%m-%d %H:%M:%S'`
log -p v -t "LOG-TEST-1" "GEN LOG level is : VERBOSE------${TIME}."
usleep 200000
done

elif [ "$1" == '2' ]; then
while true
do
TIME=`date +'%Y-%m-%d %H:%M:%S'`
log -p d -t "LOG-TEST-2" "GEN LOG level is : DEBUG--------${TIME}."
usleep 200000
done

elif [ "$1" == '3' ]; then
while true
do
TIME=`date +'%Y-%m-%d %H:%M:%S'`
log -p i -t "LOG-TEST-3" "GEN LOG level is : INFO---------${TIME}."
usleep 200000
done

elif [ "$1" == '4' ]; then
while true
do
TIME=`date +'%Y-%m-%d %H:%M:%S'`
log -p w -t "LOG-TEST-4" "GEN LOG level is : WARNING------${TIME}."
usleep 200000
done

elif [ "$1" == '5' ]; then
while true
do
TIME=`date +'%Y-%m-%d %H:%M:%S'`
log -p e -t "LOG-TEST-5" "GEN LOG level is : ERROR--------${TIME}."
usleep 200000
done

elif [ "$1" == '6' ]; then
while true
do
TIME=`date +'%Y-%m-%d %H:%M:%S'`
log -p f -t "LOG-TEST-6" "GEN LOG level is : FATAL--------${TIME}."
usleep 200000
done

elif [ "$1" == 'all' ]; then
while true
do
TIME=`date +'%Y-%m-%d %H:%M:%S'`
log -p v -t "LOG-TEST-1" "GEN LOG level is : VERBOSE------${TIME}."
log -p d -t "LOG-TEST-2" "GEN LOG level is : DEBUG--------${TIME}."
log -p i -t "LOG-TEST-3" "GEN LOG level is : INFO---------${TIME}."
log -p w -t "LOG-TEST-4" "GEN LOG level is : WARNING------${TIME}."
log -p e -t "LOG-TEST-5" "GEN LOG level is : ERROR--------${TIME}."
log -p f -t "LOG-TEST-6" "GEN LOG level is : FATAL--------${TIME}."
usleep 200000
done

else
while true
do
TIME=`date +'%Y-%m-%d %H:%M:%S'`
log -p v -t "LOG-TEST-1" "GEN LOG level is : VERBOSE------${TIME}."
log -p d -t "LOG-TEST-2" "GEN LOG level is : DEBUG--------${TIME}."
log -p i -t "LOG-TEST-3" "GEN LOG level is : INFO---------${TIME}."
log -p w -t "LOG-TEST-4" "GEN LOG level is : WARNING------${TIME}."
log -p e -t "LOG-TEST-5" "GEN LOG level is : ERROR--------${TIME}."
log -p f -t "LOG-TEST-6" "GEN LOG level is : FATAL--------${TIME}."
usleep 200000
done
fi

控制正常:

image-20240729164529373

image-20240729164820318

  • case多条件结构:
1
2
3
4
5
6
7
8
9
10
11
case variable in
pattern1)
# 当 variable 匹配 pattern1 时执行
;;
pattern2)
# 当 variable 匹配 pattern2 时执行
;;
*)
# 默认情况,当所有模式都不匹配时执行
;;
esac

按照case结构进行修改:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
TIME=`date +'%Y-%m-%d %H:%M:%S'`

case "$1" in
'1')
while true
do
TIME=`date +'%Y-%m-%d %H:%M:%S'`
log -p v -t "LOG-TEST-1" "GEN LOG level is : VERBOSE------${TIME}."
usleep 200000
done
;;
'2')
while true
do
TIME=`date +'%Y-%m-%d %H:%M:%S'`
log -p d -t "LOG-TEST-2" "GEN LOG level is : DEBUG--------${TIME}."
usleep 200000
done
;;
'3')
while true
do
TIME=`date +'%Y-%m-%d %H:%M:%S'`
log -p i -t "LOG-TEST-3" "GEN LOG level is : INFO---------${TIME}."
usleep 200000
done
;;
'4')
while true
do
TIME=`date +'%Y-%m-%d %H:%M:%S'`
log -p w -t "LOG-TEST-4" "GEN LOG level is : WARNING------${TIME}."
usleep 200000
done
;;
'5')
while true
do
TIME=`date +'%Y-%m-%d %H:%M:%S'`
log -p e -t "LOG-TEST-5" "GEN LOG level is : ERROR--------${TIME}."
usleep 200000
done
;;
'6')
while true
do
TIME=`date +'%Y-%m-%d %H:%M:%S'`
log -p f -t "LOG-TEST-6" "GEN LOG level is : FATAL--------${TIME}."
usleep 200000
done
;;
'all')
while true
do
TIME=`date +'%Y-%m-%d %H:%M:%S'`
log -p v -t "LOG-TEST-1" "GEN LOG level is : VERBOSE------${TIME}."
log -p d -t "LOG-TEST-2" "GEN LOG level is : DEBUG--------${TIME}."
log -p i -t "LOG-TEST-3" "GEN LOG level is : INFO---------${TIME}."
log -p w -t "LOG-TEST-4" "GEN LOG level is : WARNING------${TIME}."
log -p e -t "LOG-TEST-5" "GEN LOG level is : ERROR--------${TIME}."
log -p f -t "LOG-TEST-6" "GEN LOG level is : FATAL--------${TIME}."
usleep 200000
done
;;
*)
while true
do
TIME=`date +'%Y-%m-%d %H:%M:%S'`
log -p v -t "LOG-TEST-1" "GEN LOG level is : VERBOSE------${TIME}."
log -p d -t "LOG-TEST-2" "GEN LOG level is : DEBUG--------${TIME}."
log -p i -t "LOG-TEST-3" "GEN LOG level is : INFO---------${TIME}."
log -p w -t "LOG-TEST-4" "GEN LOG level is : WARNING------${TIME}."
log -p e -t "LOG-TEST-5" "GEN LOG level is : ERROR--------${TIME}."
log -p f -t "LOG-TEST-6" "GEN LOG level is : FATAL--------${TIME}."
usleep 200000
done
;;
esac

image-20240729170708234


Android中如何手动制造logcat各等级日志(VERBOSE、DEBUG、INFO、WARNING、ERROR、FATAL)
http://www.codestar.top/2024/07/29/Android/Android中如何手动制造logcat各等级日志(VERBOSE、DEBUG、INFO、WARNING、ERROR、FATAL)/
作者
mini小新
发布于
2024年7月29日
更新于
2024年7月29日
许可协议