详细教程
JAVA的日志框架有很多种,常见的几种比如Log4j、log4j2、logback、jdk-logging而前三种是出自同一人,最后一种有jdk1.4开始提供的自带的日志库实现。 目前用得比较广泛的统一日志规范接口有Slf4j和commons-logging. 这篇博客主要是记录logback和slf4j的配合使用
修改pom.xml文件
<dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-core</artifactId> </dependency>在main->resources下创建logback.xml文件作为logback的配置文件 如果是在text中 就在test->resources下创建logback-test.xml文件作为logback的配置文件
logger有日志打印级别,可以为logger指定它的日志打印级别。 如果不为一个logger指定打印级别,那么它会从它爸爸开始一直找到它祖宗(root logger)直到找到为止。 日志打印级别从低到高: TRACE<DEBUG<INFO<WARN<ERROR
在logback中,每个logger都是一个单例,调用LoggerFactory.getLogger方法时,如果传入logger name相同 获取到的logger也是同一个实例
Appender在logback中是用于确定打印位置的,一个logger可以绑定多个Appender。 默认情况下logger打印一条日志,则会打印到logger的appender以及logger的父亲和祖先的appender中,就想撸串一样一路到底。 但是如果logger设置了additivity=false那么撸串也就撸到这个地方为止,不会再往上撸了。
layout是用来设置日志信息展示格式的。 比如说
%-4relative [%thread] %-5level %logger{32} - %msg%n然后打印出来的格式效果是:
176 [main] DEBUG manual.architecture.HelloWorld2 - Hello world.上面这个格式的第一个字段代表从程序启动开始后经过的毫秒数,第二个字段代表打印出这条日志的线程名字,第三个字段代表日志信息的日志打印级别,第四个字段代表 logger name,第五个字段是日志信息,第六个字段仅仅是代表一个换行符。
在打印日志时往往会采用字符串拼接的方式打印
logger.debug("the message is " + msg + " from " + balabala);这样的方式会额外消耗计算机性能
因此在打印时更加期望的是使用占位符的方式,以参数化的方式打印日志
logger.debug("the message {} is from {}", msg, balabala);lockback支持的配置方式有:
编程式配置xml格式groovy格式logback启动时,会自动寻找配置文件,查询顺序为:
logback-test.xmllogback.groovylogback.xml查找实现Configuration接口的配置类使用自带的BasicConfigurator并将日志输出到console <!--configuration debug="true" logback会打印自身的状态信息--> <!--configuration scan="true" scanPeriod="30 seconds" 间隔30秒自 动重载配置文件实现热更新--> <configuration> <!--appender name和calss是必须填的属性 appender可以包括最多一个layout,多个encoder,多个filter--> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <!-- encoders are assigned the type ch.qos.logback.classic.encoder.PatternLayoutEncoder by default --> <encoder> <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n </pattern> </encoder> </appender> <root level="debug"> <!--指定appender--> <appender-ref ref="STDOUT" /> </root> </configuration>logback中支持用${varName} 来引用变量
<configuration> <property name="USER_HOME" value="/home/sebastien" /> <appender name="FILE" class="ch.qos.logback.core.FileAppender"> <file>${USER_HOME}/myApp.log</file> <encoder> <pattern>%msg%n</pattern> </encoder> </appender> <root level="debug"> <appender-ref ref="FILE" /> </root> </configuration>其中
<property name="USER_HOME" value="/home/sebastien" />可以通过外部文件
<property file="src/main/java/chapters/configuration/variables1.properties" />或则classpath中的文件
<property resource="resource1.properties" />变量的作用域可以通过scope指定
<property scope="context" name="nodeId" value="firstNode" />