基于Log4J LogBack集成使用详解

LogBack 在android上的使用详解

首先介绍一下 logback是log4j 同出一门.都是由log4j延伸而来


logback 重写了内部的实现,在某些特定的场景上面,甚至可以比之前的速度快上10倍。在保证logback的组件更加快速的同时,同时所需的内存更加少。
网上是这么说的具体快不快还没测试.

先来段网上的配置(如下):

使用配置

库的地址:https://github.com/tony19/logback-android

按照库上的指导,直接在module的gradle.build中的dependencies加入,版本号可根据github上最新的来,如下:
[https://upload-images.jianshu.io/upload_images/4161718-b5f50849ff9a6956.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/828/format/webp]

编写logback.xml文件

第一步环境准备完毕,直接在module的src/main下新建assets目录,如下

[]

然后在新建一个xml,命名logback,注意此处的名字一定要是logback,不然系统会找不到。关于logback.xml文件的写法和说明,我在配置文件里都做了说明,下面截图如下:
[]

在配置appender的时候,需要注意的是,如果采用RollingFileAppender的时候,又想采用时间和大小去控制日志的滚动,那么需要使用SizeAndTimmBasedRollingPolicy,不然策略不生效,即滚动条件不生效。第二点,maxFileSize这个可以设置为KB或者MB,但是只能设置为整数,如果设置为小数,则无法生成log文件,样例配置如下:

[]

第三部:代码中使用

配置文件整理完毕,现在我们看看如何使用。其实使用上有两种方式:

第一种,直接使用,此种方式是直接找到root下的appender进行处理的,如下图:

[]

第二种,指定name的appender来处理,下面就是找到logger节点name为logtest的appender,如下图:

[]

最后说明下,此处需要申明读写权限,特别在6.0以上,需要动态申请储存权限,这点不要忘记了。

至此,在Android端集成logback已基本完成。有些细节已经在配置文件中指明,有些细节如需了解还需要自己手动补充了。

1
作者:HelloMrLi 链接:https://www.jianshu.com/p/5ceb1c736485 來源:简书

如果配置没有生效 可以继续,以下才是重点.!!!!

以下是我的配置:

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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
<!--<?xml version="1.0" encoding="utf-8"?>--><!--debug属性用来决定是否打印logback的日志信息-->
<configuration debug='true'>
<!--声明一个属性,用来指定log文件存放的路径-->
<property name="LOG_DIR" value="/sdcard/0hongzhi/log" />
<!--声明一个属性,用来指定log文件存放的路径-->
<property name="LOG_HTTP_DIR" value="/sdcard/0hongzhi/post" />
<!--声明一个时间戳-->
<!--<timestamp datePattern="yyyyMMdd" key="today" />-->
<!--用于在控制台输出的Appender-->
<appender name="LOGCAT" class="ch.qos.logback.classic.android.LogcatAppender">
<encoder>
<pattern>%-5relative [%thread][%file:%M:%line] - %msg%n</pattern>
</encoder>
</appender>
<!--声明一个FileAppender-->
<appender name="BASE_FILE" class="ch.qos.logback.core.FileAppender">
<!--初始化的时候不创建文件,在第一次使用的时候创建文件-->
<lazy>true</lazy>
<!--log追加到文件,否则覆盖文件-->
<append>true</append>
<!--用来保存log的文件全路径-->
<file>${LOG_DIR}/base.log</file>
<!--输出log的格式-->
<encoder>
<!--<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} [%file:%line] - %msg%n</pattern>-->
<pattern>%date [%thread] %-5level %logger{36} [%file:%line] - %msg%n</pattern>
</encoder>
</appender>
<!--声明一个RollingFileAppender-->
<appender name="BASE_ROLL_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_DIR}/base.hongzhiapp.log</file>
<!--如果是 true,日志被追加到文件结尾,如果是 false,清空现存文件,默认是true。-->
<append>false</append>
<!--负责两件事,一是把日志信息转换成字节数组,二是把字节数组写入到输出流。-->
<!--目前PatternLayoutEncoder 是唯一有用的且默认的encoder ,有一个setPattern
(String pattern)函数,用来设置日志的输入格式。使用“%”加“转换符”方式,如果要输出“%”,则必须用“\”对“%”进行转义。-->
<encoder>
<pattern>%date %-5relative [%thread] %-5level %logger{36} [%file:%M:%line] - %msg%n
</pattern>
</encoder>
<!--setRollingPolicy(RollingPolicy policy) 当发生滚动时,决定 RollingFileAppender 的行为,涉及文件移动和重命名。-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_DIR}/base.hongzhiapp.%d{yyyy-MM-dd}.log</fileNamePattern>
<!--最大保存7天的日志-->
<maxHistory>7</maxHistory>
<totalSizeCap>10KB</totalSizeCap>
</rollingPolicy>
<!-- setTriggeringPolicy(TriggeringPolicy<E> policy)告知 RollingFileAppender 合适激活滚动。-->
<!--文件大于10mb,切换文件-->
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<maxFileSize>10KB</maxFileSize>
</triggeringPolicy>
</appender>
<!--声明第二个RollingFileAppender-->
<appender name="BASE_HTTP_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_HTTP_DIR}/base.hongzhiapp.log</file>
<!--如果是 true,日志被追加到文件结尾,如果是 false,清空现存文件,默认是true。-->
<append>true</append>
<!--负责两件事,一是把日志信息转换成字节数组,二是把字节数组写入到输出流。-->
<!--目前PatternLayoutEncoder 是唯一有用的且默认的encoder ,有一个setPattern
(String pattern)函数,用来设置日志的输入格式。使用“%”加“转换符”方式,如果要输出“%”,则必须用“\”对“%”进行转义。-->
<encoder>
<pattern>【%date】 %logger{36} %msg%n</pattern>
</encoder>
<!--setRollingPolicy(RollingPolicy policy) 当发生滚动时,决定 RollingFileAppender 的行为,涉及文件移动和重命名。-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_HTTP_DIR}/base.hongzhiapp.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<!--最大保存7天的日志-->
<!--<maxHistory>${log.max.history}</maxHistory>-->
<maxHistory>7</maxHistory>
<!-- 当天的日志大小 超过${log.max.size}时,压缩日志并保存 -->
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>30KB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<!--setTriggeringPolicy(TriggeringPolicy<E> policy)告知 RollingFileAppender 合适激活滚动。-->
<!--文件大于10mb,切换文件-->
<!--<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">-->
<!--<maxFileSize>10KB</maxFileSize>-->
<!--</triggeringPolicy>-->
</appender>
<!--指定logtest采用BASE_ROLL_FILE声明的RollingFileAppender输出日志-->
<logger name="logtest">
<appender-ref ref="BASE_ROLL_FILE" />
</logger>
<logger name="http">
<appender-ref ref="BASE_HTTP_FILE" />
</logger>
<!-- Write INFO (and higher-level) messages to the log file -->
<root level="TRACE">
<appender-ref ref="LOGCAT" />
</root>
<!--支持的level-->
<!--TRACE-->
<!--DEBUG-->
<!--INFO-->
<!--WARN-->
<!--ERROR-->
<!--<pattern>
%d{yyyy-MM-dd HH:mm:ss} [%level] - %msg%n
Logger: %logger
Class: %class
File: %file
Caller: %caller
Line: %line
Message: %m
Method: %M
Relative: %relative
Thread: %thread
Exception: %ex
xException: %xEx
nopException: %nopex
rException: %rEx
Marker: %marker
%n
</pattern>-->
<!--引用其他位置的配置信息-->
<!--<includes>-->
<!--<include file="/sdcard/foo.xml"/>-->
<!--<include resource="assets/config/test.xml"/>-->
<!--<include resource="AndroidManifest.xml"/>-->
<!--<include file="/sdcard/logback/logback-test.xml"/>-->
<!--<include file="/sdcard/logback/logback.xml"/>-->
<!--<include resource="AndroidManifest.xml"/>-->
<!--<include resource="assets/logback-test.xml"/>-->
<!--<include resource="assets/logback.xml"/>-->
<!--</includes>-->
</configuration>

  • configuration 配置的基类 可以配置debug属性用来决定是否打印logback的日志信息,还可以配置扫描频率等
1
2
3
<configuration debug='true'></configuration>
或 <configuration scan="true" scanPeriod="60 seconds" debug="false">
或 <configuration ></configuration> //使用默认
  • property 声明全局常量,我这里声明了两个路径,可以配置多个
    用来定义变量值的标签, 有两个属性,name和value;其中name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义变量后,可以使“${}”来使用变量。

    1
    2
    3
    <property name="LOG_DIR" value="/sdcard/0hongzhi/log" />
    <!--声明一个属性,用来指定log文件存放的路径-->
    <property name="LOG_HTTP_DIR" value="/sdcard/0hongzhi/post" />
  • timestamp 声明一个时间戳,可多个不同样式.主要目的在下边用的时候不用重复声明了,两个属性 key:标识此 的名字;datePattern:设置将当前时间(解析配置文件的时间)转换为字符串的模式,遵循java.txt.SimpleDateFormat的格式。

    1
    <!--<timestamp datePattern="yyyyMMdd" key="today" />-->
  • LogcatAppender 用于在控制输出,name可以标识 用来调用, class 用于引用

    1
    2
    3
    4
    5
    6
    <!--用于在控制台输出的Appender-->
    <appender name="LOGCAT" class="ch.qos.logback.classic.android.LogcatAppender">
    <encoder>
    <pattern>%-5relative [%thread][%file:%M:%line] - %msg%n</pattern>
    </encoder>
    </appender>
  • FileAppender 我这里没有到 我在配置中虽然写了.
    把日志添加到文件,有以下子节点:

1
2
3
4
5
6
7
<file>:被写入的文件名,可以是相对目录,也可以是绝对目录,如果上级目录不存在会自动创建,没有默认值。
<append>:如果是 true,日志被追加到文件结尾,如果是 false,清空现存文件,默认是true。
<encoder>:对记录事件进行格式化。(具体参数稍后讲解 )
<prudent>:如果是 true,日志会被安全的写入文件,即使其他的FileAppender也在向此文件做写入操作,效率低,默认是 false。

重点属性

  • RollingFileAppender 滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件。
1
2
3
4
5
6
<file>:被写入的文件名,可以是相对目录,也可以是绝对目录,如果上级目录不存在会自动创建,没有默认值。
<append>:如果是 true,日志被追加到文件结尾,如果是 false,清空现存文件,默认是true。
<encoder>:对记录事件进行格式化。(具体参数稍后讲解 )
<rollingPolicy>:当发生滚动时,决定 RollingFileAppender 的行为,涉及文件移动和重命名。
<triggeringPolicy >: 告知 RollingFileAppender 合适激活滚动。
<prudent>:当为true时,不支持FixedWindowRollingPolicy。支持TimeBasedRollingPolicy,但是有两个限制,1不支持也不允许文件压缩,2不能设置file属性,必须留空。

rollingPolicy

  • TimeBasedRollingPolicy 最常用的滚动策略,它根据时间来制定滚动策略,既负责滚动也负责出发滚动。有以下子节点:
1
2
3
4
<fileNamePattern>:
必要节点,包含文件名及“%d”转换符, “%d”可以包含一个 java.text.SimpleDateFormat指定的时间格式,如:%d{yyyy-MM}。如果直接使用 %d,默认格式是 yyyy-MM-dd。 RollingFileAppender 的file字节点可有可无,通过设置file,可以为活动文件和归档文件指定不同位置,当前日志总是记录到file指定的文件(活动文件),活动文件的名字不会改变;如果没设置file,活动文件的名字会根据fileNamePattern 的值,每隔一段时间改变一次。“/”或者“\”会被当做目录分隔符。
<maxHistory>:
可选节点,控制保留的归档文件的最大数量,超出数量就删除旧文件。假设设置每个月滚动,且 <maxHistory>是6,则只保存最近6个月的文件,删除之前的旧文件。注意,删除旧文件是,那些为了归档而创建的目录也会被删除。

>

  • FixedWindowRollingPolicy 根据固定窗口算法重命名文件的滚动策略
    1
    2
    3
    4
    <minIndex>:窗口索引最小值
    <maxIndex>:窗口索引最大值,当用户指定的窗口过大时,会自动将窗口设置为12。
    <fileNamePattern >:
    必须包含“%i”例如,假设最小值和最大值分别为1和2,命名模式为 mylog%i.log,会产生归档文件mylog1.log和mylog2.log。还可以指定文件压缩选项,例如,mylog%i.log.gz 或者 没有log%i.log.zip

>

  • triggeringPolicy
    1
    2
    SizeBasedTriggeringPolicy: 查看当前活动文件的大小,如果超过指定大小会告知 RollingFileAppender 触发当前活动文件滚动。只有一个节点:
    <maxFileSize>:这是活动文件的大小,默认值是10MB。