详细教程
JAVA的日志框架有很多种,常见的几种比如Log4j、log4j2、logback、jdk-logging而前三种是出自同一人,最后一种有jdk1.4开始提供的自带的日志库实现。
目前用得比较广泛的统一日志规范接口有Slf4j和commons-logging.
这篇博客主要是记录logback和slf4j的配合使用
修改pom.xml文件
<dependency>
<groupId>org.slf4jgroupId>
<artifactId>slf4j-apiartifactId>
dependency>
<dependency>
<groupId>ch.qos.logbackgroupId>
<artifactId>logback-classicartifactId>
dependency>
<dependency>
<groupId>ch.qos.logbackgroupId>
<artifactId>logback-coreartifactId>
dependency>
在main->resources下创建logback.xml文件作为logback的配置文件
如果是在text中
就在test->resources下创建logback-test.xml文件作为logback的配置文件
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%nPattern>
layout>
appender>
<logger name="com.base22" level="TRACE"/>
<root level="debug">
<appender-ref ref="STDOUT" />
root>
configuration>
<configuration debug="false" scan="true" scanPeriod="30 seconds" packagingData="true">
<contextName>myAppNamecontextName>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%npattern>
encoder>
appender>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>./my_log.logfile>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>./my_log%d{yyyyMMdd}.log.zipFileNamePattern>
<maxHistory>30maxHistory>
rollingPolicy>
<encoder>
<pattern>%d{HH:mm:ss.SSS}[%-5level][%thread]%logger{36} - %msg%npattern>
encoder>
appender>
<logger name="com.yinz" level="debug" additivity="false" >
<appender-ref ref="FILE"/>
logger>
<root level="debug">
<appender-ref ref="STDOUT" />
<appender-ref ref="FILE" />
root>
configuration>
public class Application {
private static final Logger logger = LoggerFactory.getLogger(Application.class);
public static void main(String[] args) {
logger.info("info");
logger.error("error ");
logger.debug("debug");
}
}
logger有日志打印级别,可以为logger指定它的日志打印级别。
如果不为一个logger指定打印级别,那么它会从它爸爸开始一直找到它祖宗(root logger)直到找到为止。
日志打印级别从低到高:
TRACE
在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支持的配置方式有:
logback启动时,会自动寻找配置文件,查询顺序为:
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
pattern>
encoder>
appender>
<root level="debug">
<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.logfile>
<encoder>
<pattern>%msg%npattern>
encoder>
appender>
<root level="debug">
<appender-ref ref="FILE" />
root>
configuration>
其中
可以通过外部文件
或则classpath中的文件
变量的作用域可以通过scope指定