https://logback.qos.ch/manual/introduction.html
logback.xml
<configuration>
<appender name="STDOUT"
class="ch.qos.logback.core.ConsoleAppender">
<encoder
class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} -
%msg%npattern>
encoder>
appender>
<root level="INFO">
<appender-ref ref="STDOUT" />
root>
configuration>
java测试类
public class App {
private final static Logger logger = LoggerFactory.getLogger(App.class);
public static void main(String[] args) {
logger.error("logback error测试");
logger.info("logback info测试");
logger.debug("logback debug测试");
}
}
输出日志
2019-08-03 19:52:02.500 [main] ERROR priv.dengjili.LogbbackDemo.App -
logback error测试
2019-08-03 19:52:02.505 [main] INFO priv.dengjili.LogbbackDemo.App -
logback info测试
ps:级别排序为: TRACE < DEBUG < INFO < WARN < ERROR
,当前日志配置为INFO
,只能输出级别大于等于INFO的日志
将日志级别改为WARN
<root level="WARN">
<appender-ref ref="STDOUT" />
root>
再次运行测试类,输出日志
2019-08-03 19:54:24.526 [main] ERROR priv.dengjili.LogbbackDemo.App -
logback error测试
logback.xml
<configuration>
<appender name="STDOUT"
class="ch.qos.logback.core.ConsoleAppender">
<encoder
class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} -
%msg%npattern>
encoder>
appender>
<logger name="priv.dengjili.LogbbackDemo" level="INFO"/>
<logger name="myLogger" level="DEBUG"/>
<root level="WARN">
<appender-ref ref="STDOUT" />
root>
configuration>
以上配置说明
WARN
INFO
DEBUG
public class App {
private final static Logger logger = LoggerFactory.getLogger(App.class);
public static void main(String[] args) {
logger.error("logback error测试");
logger.info("logback info测试");
logger.debug("logback debug测试");
}
}
public class App2 {
private final static Logger logger = LoggerFactory.getLogger(App2.class);
public static void main(String[] args) {
logger.error("logback error测试");
logger.info("logback info测试");
logger.debug("logback debug测试");
}
}
public class App3 {
private final static Logger logger = LoggerFactory.getLogger("myLogger");
public static void main(String[] args) {
logger.error("logback error测试");
logger.info("logback info测试");
logger.debug("logback debug测试");
}
}
App 输出日志(日志级别为INFO)
2019-08-03 20:06:05.058 [main] ERROR priv.dengjili.LogbbackDemo.App -
logback error测试
2019-08-03 20:06:05.061 [main] INFO priv.dengjili.LogbbackDemo.App -
logback info测试
App2 输出日志(日志级别为WARN)
2019-08-03 20:06:54.787 [main] ERROR priv.dengjili.App2 -
logback error测试
App3 输出日志(日志级别为DEBUG)
2019-08-03 20:07:12.966 [main] ERROR myLogger -
logback error测试
2019-08-03 20:07:12.969 [main] INFO myLogger -
logback info测试
2019-08-03 20:07:12.970 [main] DEBUG myLogger -
logback debug测试
<configuration>
<property name="LOG_HOME" value="./logs" />
<appender name="FILE"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy
class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>${LOG_HOME}/Test.log.%d{yyyy-MM-dd}.log
FileNamePattern>
<MaxHistory>30MaxHistory>
rollingPolicy>
<encoder
class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} -
%msg%npattern>
encoder>
<triggeringPolicy
class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>10MBMaxFileSize>
triggeringPolicy>
appender>
<root level="INFO">
<appender-ref ref="FILE" />
root>
configuration>
运行执行的测试类,当前目录产生日志文件
文件内容为,配置的INFO级别
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<property name="APP_Name" value="myAppName" /> \
configuration>
与spring中配置property使用一直,变量替换
负责写日志的组件,它有两个必要属性name和class。name指定appender名称,class指定appender的全限定名。日志输出目的,有ConsoleAppender(输出到控制台)、FileAppender(输出到文件)、SMTPAppender(输出到邮件)、
DBAppender(输出到数据库)、AsyncAppender(异步输出,包装其它具体的appender,不单独使用)等。
把日志输出到控制台,有以下子节点:
:对日志进行格式化。(具体参数稍后讲解 )
:字符串System.out(默认)或者System.err(区别不多说了)<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%-4relative [%thread] %-5level %logger{35} - %msg %npattern>
encoder>
appender>
<root level="DEBUG">
<appender-ref ref="STDOUT" />
root>
configuration>
把日志添加到文件,有以下子节点:
:被写入的文件名,可以是相对目录,也可以是绝对目录,如果上级目录不存在会自动创建,没有默认值。
:如果是 true,日志被追加到文件结尾,如果是 false,清空现存文件,默认是true。
:对记录事件进行格式化。(具体参数稍后讲解 )
:如果是 true,日志会被安全的写入文件,即使其他的FileAppender也在向此文件做写入操作,效率低,默认是 false。<configuration>
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>testFile.logfile>
<append>trueappend>
<encoder>
<pattern>%-4relative [%thread] %-5level %logger{35} - %msg%npattern>
encoder>
appender>
<root level="DEBUG">
<appender-ref ref="FILE" />
root>
configuration>
滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件。有以下子节点:
:被写入的文件名,可以是相对目录,也可以是绝对目录,如果上级目录不存在会自动创建,没有默认值。
:如果是 true,日志被追加到文件结尾,如果是 false,清空现存文件,默认是true。
:当发生滚动时,决定RollingFileAppender的行为,涉及文件移动和重命名。属性class定义具体的滚动策略类
:必要节点,包含文件名及“%d”转换符,“%d”可以包含一个java.text.SimpleDateFormat指定的时间格式,如:%d{yyyy-MM}。
:
是6,则只保存最近6个月的文件,删除之前的旧文件。注意,删除旧文件是,那些为了归档而创建的目录也会被删除。class=“ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy”: 查看当前活动文件的大小,如果超过指定大小会告知RollingFileAppender 触发当前活动文件滚动。只有一个节点:
:这是活动文件的大小,默认值是10MB。
:当为true时,不支持FixedWindowRollingPolicy。支持TimeBasedRollingPolicy,但是有两个限制,1不支持也不允许文件压缩,2不能设置file属性,必须留空。
: 告知 RollingFileAppender 合适激活滚动。
class=“ch.qos.logback.core.rolling.FixedWindowRollingPolicy” 根据固定窗口算法重命名文件的滚动策略。有以下子节点:
:窗口索引最小值
:窗口索引最大值,当用户指定的窗口过大时,会自动将窗口设置为12。
:必须包含“%i”例如,假设最小值和最大值分别为1和2,命名模式为 mylog%i.log,会产生归档文件mylog1.log和mylog2.log。还可以指定文件压缩选项,例如,mylog%i.log.gz 或者 没有log%i.log.zip
<configuration>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>logFile.%d{yyyy-MM-dd}.logfileNamePattern>
<maxHistory>30maxHistory>
rollingPolicy>
<encoder>
<pattern>%-4relative [%thread] %-5level %logger{35} - %msg%npattern>
encoder>
appender>
<root level="DEBUG">
<appender-ref ref="FILE" />
root>
configuration>
<configuration>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>test.logfile>
<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
<fileNamePattern>tests.%i.log.zipfileNamePattern>
<minIndex>1minIndex>
<maxIndex>3maxIndex>
rollingPolicy>
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<maxFileSize>5MBmaxFileSize>
triggeringPolicy>
<encoder>
<pattern>%-4relative [%thread] %-5level %logger{35} - %msg%npattern>
encoder>
appender>
<root level="DEBUG">
<appender-ref ref="FILE" />
root>
configuration>
异步添加日志,不单独使用,一般通过引用其它具体的appender来使用。如:
<appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender">
<appender-ref ref="FILE" />
appender>
设置某一包或类下的日志打印级别、appender。
<logger name="com.dragon.study.log.Slf4jAndLogbackMainTwo" level="warn" additivity="false">
<appender-ref ref="STDOUT" />
logger>
指定日志级别及输出的appender,如:
<root level="info">
<appender-ref ref="STDOUT" />
<appender-ref ref="FILE" />
root>
通过实现ch.qos.logback.core.filter.Filter接口可以自定义过滤器,示例如下:
自定义过滤器类LogbackUrlFilter.class
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.filter.Filter;
import ch.qos.logback.core.spi.FilterReply;
public class LogbackUrlFilter extends Filter<ILoggingEvent> {
@Override
public FilterReply decide(ILoggingEvent event) {
if(event.getMessage().contains("url")){
return FilterReply.ACCEPT;
}
return FilterReply.DENY;
}
}
配置如下:
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<filter class="com.dragon.study.log.LogbackUrlFilter" />
<encoder>
<pattern>%date %level %logger : %msg %npattern>
encoder>
appender>
另外过滤器还可以来自自带的或表达式直接写在配置文件中,如下:
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFOlevel>
<onMatch>ACCEPTonMatch>
<onMismatch>NEUTRALonMismatch>
filter>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>WARNlevel>
filter>
<evaluator >
<expression>
//根据logger名称判断
if(logger.equals("Slf4jAndLogbackMain"){
return true;
}
//根据返回值判断
if(event.getStatusCode()==200){
return true;
}
//根据日志消息判断
if(message.contains("url")){
return true;
}
return false;
expression>
evaluator>
<onMatch>ACCEPTonMatch>
<onMismatch>DENYonMismatch>
filter>
定义每行日志记录的格式,官网地址:https://logback.qos.ch/manual/layouts.html ,
常用变量别名(包括全称和简称)有:
变量名
%logger(简写:%c或%lo): 当前日志名称,如: Slf4jAndLogbackMain
%class(简写:%C): 日志调用所在类,如: com.dragon.study.log.Slf4jAndLogbackMain
%method(简写:%M): 日志所在方法,如: main
%caller: 日志调用位置,如:at com.dragon.study.log.Slf4jAndLogbackMain.main(Slf4jAndLogbackMain.java:15)
%thread(简写:%t): 日志调用所有线程序,如:main
%level(简写:%p或%le): 日志级别,如:INFO
%date(简写:%d): 日期,如: 2018-12-15 21:40:12,890
%msg(简写:%m): 日志记录内容
%exception(简写:%ex): 异常记录
宽度设置
%20logger:当字符数少于20个字符时,则左侧留空白;
%-20logger:当字符数少于20个字符时,则右侧留空白;
%.30logger:当字符数据大于30个时,则截断;
显示设置
%highligth:突出显示
%green(%red、%blue、%white):字体显示为指定颜色
{length}可指定长度,如%logger{36}
网络访问设置(依赖logger-access包)
%remoteIP(简写:%a):远程ip;
%localIP(简写:%A):本地ip;
%clientHost(简写:%h):远程主机名;
%localPort:本地端口;
%requestMethod(简写:%m):http请求方法;
%protocol(简写:%H):http请求协议;
%statusCode(简写:%s):http请求status code;
%requestURL(简写:%r):http请求地址;
%requestURI(简写:%U):http请求资源地址;
%queryString(简写:%q):http请求参数;
%server(简写:%v):服务器地址;
%elapsedTime(简写:%D):http请求处理的时间,单位是毫秒;
%elapsedSeconds(简写:%T):http请求处理的时间,单位是秒;
%date(简写:%t):日志记录时间;
%threadName(简写:%I):处理请求的线程名;
%reqAttribute{attributeName}:http请求attribute值;
%reqCookie{cookie}:http请求cookie值;
%reqContent:http请求体内容;
%fullRequest:http完整请求;
%responseContent:http响应;
%fullResponse:http完整响应;
示例如:
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<encoder>
<pattern>%date %logger %class %method %highlight(%level) %thread : %msg%npattern>
encoder>
encoder>
appender>