我是靠谱客的博主 小巧心锁,这篇文章主要介绍LogBack——LogBack在项目(Web或Java)中的应用前言LogBack问题,现在分享给大家,希望可以做个参考。

前言

前段时间,将团队框架中的Struts2切换到SpringMVC,做一个系统系统,同时将一些共用组件抽取、独立,团队成员提议使用LogBack记录日志,因之前做的基础组件使用的Log4j,对LogBack不太熟悉,所以自己学习了一下LogBack,学习过程中,发现心仪的中文资料比较少,结合自己开的项目,分享一下LogBack在项目中的应用及自己所遇到的问题。回过头思考使用LogBack的过程,官方文档还是最准确、最完成的学习资源,虽然是英文的,正好此时在翻译一本英文书籍,能静下心去看官方的文档,解决了项目中遇到的一些问题。
项目中使用的LogBack的配置如下:
其文件已经放到GitHub上,地址: https://github.com/wangdongsong/java/blob/master/src/main/java/com/wds/java/base/web/log/logback.xml
复制代码
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
140
<?xml version="1.0" encoding="UTF-8"?> <!-- 说明: 1、日志级别及文件 日志记录采用分级记录,级别与日志文件名相对应,不同级别的日志信息记录到不同的日志文件中 例如:error级别记录到log_error_xxx.log或log_error.log(该文件为当前记录的日志文件),而log_error_xxx.log为归档日志, 日志文件按日期记录,同一天内,若日志文件大小等于或大于2M,则按0、1、2...顺序分别命名 例如log-level-2013-12-21.0.log 其它级别的日志也是如此。 2、文件路径 若开发、测试用,在Eclipse中运行项目,则到Eclipse的安装路径查找logs文件夹,以相对路径../logs。 若部署到Tomcat下,则在Tomcat下的logs文件中 3、Appender FILEERROR对应error级别,文件名以log-error-xxx.log形式命名 FILEWARN对应warn级别,文件名以log-warn-xxx.log形式命名 FILEINFO对应info级别,文件名以log-info-xxx.log形式命名 FILEDEBUG对应debug级别,文件名以log-debug-xxx.log形式命名 stdout将日志信息输出到控制上,为方便开发测试使用 --> <configuration> <!-- 在Eclipse中运行,请到Eclipse的安装目录中找log文件,Tomcat下,请到Tomcat目录下找 --> <property name="LOG_PATH" value="../logs" /> <!-- 日志记录器,日期滚动记录 --> <appender name="FILEERROR" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 正在记录的日志文件的路径及文件名 --> <file>${LOG_PATH}/log_error.log</file> <!-- 日志记录器的滚动策略,按日期,按大小记录 --> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- 归档的日志文件的路径,例如今天是2013-12-21日志,当前写的日志文件路径为file节点指定,可以将此文件与file指定文件路径设置为不同路径,从而将当前日志文件或归档日志文件置不同的目录。 而2013-12-21的日志文件在由fileNamePattern指定。%d{yyyy-MM-dd}指定日期格式,%i指定索引 --> <fileNamePattern>${LOG_PATH}/log-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern> <!-- 除按日志记录之外,还配置了日志文件不能超过2M,若超过2M,日志文件会以索引0开始, 命名日志文件,例如log-error-2013-12-21.0.log --> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <maxFileSize>2MB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> </rollingPolicy> <!-- 追加方式记录日志 --> <append>true</append> <!-- 日志文件的格式 --> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <pattern>%-5p [%d] %C:%L - %m %n</pattern> <charset>utf-8</charset> </encoder> <!-- 此日志文件只记录error级别的 --> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>error</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender> <appender name="FILEWARN" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${LOG_PATH}/log_warn.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>${LOG_PATH}/log-warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <maxFileSize>2MB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> </rollingPolicy> <append>true</append> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <pattern>%-5p [%d] %C:%L - %m %n</pattern> <charset>utf-8</charset> </encoder> <!-- 此日志文件只记录warn级别,不记录大于warn级别的日志 --> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>WARN</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender> <appender name="FILEINFO" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${LOG_PATH}/log_info.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>${LOG_PATH}/log-info-%d{yyyy-MM-dd}.%i.log</fileNamePattern> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <maxFileSize>2MB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> </rollingPolicy> <append>true</append> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <pattern>%-5p [%d] %C:%L - %m %n</pattern> <charset>utf-8</charset> </encoder> <!-- 此日志文件只记录info级别,不记录大于info级别的日志 --> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>INFO</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender> <appender name="FILEDEBUG" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${LOG_PATH}/log_debug.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>${LOG_PATH}/log-debug-%d{yyyy-MM-dd}.%i.log</fileNamePattern> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <maxFileSize>2MB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> </rollingPolicy> <append>true</append> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <pattern>%-5p [%d] %C:%L - %m %n</pattern> <charset>utf-8</charset> </encoder> <!-- 此日志文件只记录debug级别,不记录大于debug级别的日志 --> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>DEBUG</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender> <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender"> <Target>System.out</Target> <encoder> <pattern>%-5p [%d] %C:%L - %m %n</pattern> <charset>utf-8</charset> </encoder> <!-- 此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息--> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>DEBUG</level> </filter> </appender> <!-- 为单独的包配置日志级别,若root的级别大于此级别, 此处级别也会输出 应用场景:生产环境一般不会将日志级别设置为trace或debug,但是为详细的记录SQL语句的情况, 可将hibernate的级别设置为debug,如此一来,日志文件中就会出现hibernate的debug级别日志, 而其它包则会按root的级别输出日志 --> <logger name="org.hibernate.SQL" level="DEBUG" /> <logger name="org.hibernate.jdbc" level="DEBUG"/> <logger name="org.springframework" level="DEBUG"/> <!-- 生产环境,将此级别配置为适合的级别,以名日志文件太多或影响程序性能 --> <root level="INFO"> <appender-ref ref="FILEDEBUG" /> <appender-ref ref="FILEINFO" /> <appender-ref ref="FILEWARN" /> <appender-ref ref="FILEERROR" /> <!-- 生产环境将请stdout去掉 --> <appender-ref ref="stdout" /> </root> </configuration>


LogBack

LogBack是由log4j的创始人开发的一个日志组件,用于替代log4j。LogBack的架构设计足够通用,可适用于不同的环境,目前LogBack分为三个模:lobback-core,logback-classic和logback-access。

core模块是其它两个模块的基础,classic是core的扩展,是log4j巨大改进的版本。LogBack-classic本身实现了SL4J的API,因此可以很容易的在logback与其它日志系统之间转换,例如log4j、JDK1.4中的java.util.logging(JUL)。第三个模块access,它集成了Servlet容器,提供了通过HTTP访问日志的功能,若了解access可访问其独立文档http://logback.qos.ch/access.html。

LogBack的日志级别有trace、debug、info、warn、error,关于基级别,可参考官方文档(http://logback.qos.ch/manual/architecture.html)。

配置

LogBack可以通过编程式或以XML、Groovy格式配置,原来使用log4j的用户可以通过 属性转换器将log4j.properties转换成logback.xml文件。我在使用这个转换器的时候,能转换成功,但是在Web-App中日志输出的有点小问题,后来就自己写logback.xml文件,LogBack读取配置或属性文件的步骤:
  1. LogBack在类路径下尝试查找logback.groovy的文件。
  2. 如果logback.groovy没有找到,就在类路径下查找logback-test.xml文件。
  3. 若logback-test.xml文件没有找到,就会在类路径下查找logback.xml文件(自己使用的就是这种方式,将logback.xml配置文件放到类路径下)。
  4. 如果都找不到,LogBack就会使用BasicConfigurator启动默认配置,该配置会将日志输出到控制上。
第4步,意味着使用缺省配置,它提供了默认(最基础)的日志功能。
如果使用Maven,可以将logback-test.xml的配置文件置于src/test/resources文件夹下,因此,可以在测试时使用logback-test.xml配置,而在产品中使用logback.xml,这一点,我也木用使用到。我的用法是Web-App中,将logback.xml文件放到了src/main/resources路径下,而在Java-App中,将文件放到src/main/java下,如下图:

Web-App的目录结构图:

Java工程的目录结构图:

Appender

LogBack的日志Appender都必须实现 ch.qos.logback.core.Appender接口,常用的有ConsoleAppender、FileAppender和RollingFileAppender,类图如下:


项目中使用的Appender有两种:ConsoleAppender和RollingFileAppender
ConsoleAppender:主要是将日志信息输出到控制上,在上面的日志文件中,stdout的Append就是ConsoleAppender
RollingFileAppender:是按日期滚动记录日志,例如RollingFileAppender将日志记录到log.txt文件中,一旦设置的条件满足,就将日志信息记录到另一个文件中,它继承FileAppender。与RollingFileAppender交互的两个重要组件分别是:RollingPolicy和TriggeringPolicy。前者负责滚动神马,后者负责神马时候滚动。
任何时候使用,RollingFileAppender都必须有RollingFileAppender和TriggeringPolicy的配置,但是如果它的RollingPolicy也实现了TriggeringPolicy接口,只需要指定前者即可。此点需要注意:笔者在使用时,就忽略这一点,导致日志滚动不成功。其具体属性如下:(以项目中使用到的为例 )
  • file:继承自FileAppender,指定日志文件名。
  • append:继承自FileAppender,为true,日志将追加到日志文件的尾部,false将删除已经存在的日志文件,默认为true。
  • encoder:Encoder,指定日志格式及编码
RollingPolicy
TimeBaseRollingPolicy可能是最常用的滚动策略了,它是基于时间的,例如可以以天或月为周期,同时,这个类同时实现了RollingPolicy接口和TriggeringPolicy接口。在RollingFileAppender中只使用这个类就可以了,项目中就是使用的这个RollingPolicy,日期格式由%d{yyyy-MM-dd}指定,%i是索引。具体配置可参考上述的配置文件。RollingPolicy还有一此其它属性,具体可参考官方文档,项目中未使用到,例如最大历史期限等。
LogBack也提供了FixedWindowRollingPolicy,该类未使用,可参考官方文件。
此外,我们还可以根据时间和大小来决定滚动策略,在项目中使用的就是这种类型,项目中使用配置文件可见上述,下面为官方提供的配置文件:
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<configuration> <appender name="ROLLING" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>mylog.txt</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- rollover daily --> <fileNamePattern>mylog-%d{yyyy-MM-dd}.%i.txt</fileNamePattern> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <!-- or whenever the file size reaches 100MB --> <maxFileSize>100MB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> </rollingPolicy> <encoder> <pattern>%msg%n</pattern> </encoder> </appender> <root level="DEBUG"> <appender-ref ref="ROLLING" /> </root> </configuration>

TriggeringPolicy
SizeBasedTriggeringPolicy:控制当前文件大小,如果日志文件大于指定的大小,则触发滚动,由maxFileSize属性指定,该值可以取KB、MB、及GB,如下下面的配置文件(官方提供的,未在项目中使用):
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<configuration> <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>test.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy"> <fileNamePattern>test.%i.log.zip</fileNamePattern> <minIndex>1</minIndex> <maxIndex>3</maxIndex> </rollingPolicy> <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> <maxFileSize>5MB</maxFileSize> </triggeringPolicy> <encoder> <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern> </encoder> </appender> <root level="DEBUG"> <appender-ref ref="FILE" /> </root> </configuration>

Filter

项目中使用到了LevelFilter和ThresholdFilter两种,官方还提供了其它的Filter可参考。
LevelFilter:基于精确匹配,如果事件的级别与配置的级别相同,则将会根据已经配置的onMatch和onMismatch的属性决定接受或拒绝,如果项目中的使用的配置文件中的FILEERROR、FILEWARN、FILEINFO、FILEDEBUG,下面的配置是官方提供的配置:
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<configuration> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>INFO</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> <encoder> <pattern> %-4relative [%thread] %-5level %logger{30} - %msg%n </pattern> </encoder> </appender> <root level="DEBUG"> <appender-ref ref="CONSOLE" /> </root> </configuration>

ThresholdFilter:指定下限级别,低于此级别的事件将被拒绝,如果项目中使用的配置文件中的stdout的配置,下面为官方提供的配置:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<configuration> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <!-- deny all events with a level below INFO, that is TRACE and DEBUG --> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>INFO</level> </filter> <encoder> <pattern> %-4relative [%thread] %-5level %logger{30} - %msg%n </pattern> </encoder> </appender> <root level="DEBUG"> <appender-ref ref="CONSOLE" /> </root> </configuration>
官方提供了其它的Filter,也可以自己实现自己的Filter,具体参考官方文档。

问题

1、路径
这个问题在配置文件中做了详细的注释,请参考。
2、关于Spring或其它已经使用了log4j、common-logging或java.util.longging的集成
LogBack提供了jcl-over-slf4j和jul-to-slf4j,jcl是指common-logging,jul指java.utils.longging,如果需要将Spring的日志统一处理,就需要将jcl-over-slf4j的包加入到工作中,项目中使用Maven开发,依赖如下:
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-core</artifactId> <version>1.0.13</version> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.0.13</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>jcl-over-slf4j</artifactId> <version>1.7.0</version> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-access</artifactId> <version>1.0.13</version> </dependency>
3、代码区别
源写法:
复制代码
1
2
3
if (logger.isInfoEnabled()) { logger.info("***** BaseAuthoritiesResourcesServiceImpl.getList() method begin*****"); }
使用LogBack之后,可将if判断去掉,如下:
复制代码
1
logger.debug("***** BaseDictionaryServiceImpl.delete() method begin*****");
如果 日志级别高于Debug,则这一行日志信息将不会输出。

最后

以上就是小巧心锁最近收集整理的关于LogBack——LogBack在项目(Web或Java)中的应用前言LogBack问题的全部内容,更多相关LogBack——LogBack在项目(Web或Java)中内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(77)

评论列表共有 0 条评论

立即
投稿
返回
顶部