logback基本使用

官网入口

https://logback.qos.ch/manual/introduction.html

logback基本使用

配置console输出日志

logback.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
	<!-- 控制台输出 -->
	<appender name="STDOUT"
		class="ch.qos.logback.core.ConsoleAppender">
		<encoder
			class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
			<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符 -->
			<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} -
				%msg%n</pattern>
		</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测试
指定目录/指定名称的log输出不同级别的日志

logback.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
	<!-- 控制台输出 -->
	<appender name="STDOUT"
		class="ch.qos.logback.core.ConsoleAppender">
		<encoder
			class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
			<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符 -->
			<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} -
				%msg%n</pattern>
		</encoder>
	</appender>
	
	<!-- 继承root配置,重写独有配置 -->
	<logger name="priv.dengjili.LogbbackDemo" level="INFO"/>
	<logger name="myLogger" level="DEBUG"/>
	
	<!-- 日志输出级别 -->
	<root level="WARN">
		<appender-ref ref="STDOUT" />
	</root>
</configuration>

以上配置说明

  • root定义了全局日志级别WARN
  • priv.dengjili.LogbbackDemo包下面重写了root级别为INFO
  • 日志名称为myLogger重写了root级别为DEBUG

新建两个文件,目录如下
在这里插入图片描述
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测试");
	}
}
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测试

配置输出日志到文件
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
	<!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径 -->
	<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>30</MaxHistory>
		</rollingPolicy>
		<encoder
			class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
			<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符 -->
			<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} -
				%msg%n</pattern>
		</encoder>
		<!--日志文件最大的大小 -->
		<triggeringPolicy
			class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
			<MaxFileSize>10MB</MaxFileSize>
		</triggeringPolicy>
	</appender>

	<!-- 日志输出级别 -->
	<root level="INFO">
		<appender-ref ref="FILE" />
	</root>
</configuration>

运行执行的测试类,当前目录产生日志文件
在这里插入图片描述
文件内容为,配置的INFO级别
在这里插入图片描述

logback配置

根节点<configuration>
<configuration scan="true" scanPeriod="60 seconds" debug="false"> 
    <!--其他配置省略--> 
</configuration
  • scan: 当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。
  • scanPeriod: 设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。
  • debug: 当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。
节点<property>
<configuration scan="true" scanPeriod="60 seconds" debug="false"> 
   <property name="APP_Name" value="myAppName" /> \
   <!--其他配置省略--> 
</configuration>

与spring中配置property使用一直,变量替换

节点<appender>

负责写日志的组件,它有两个必要属性name和class。name指定appender名称,class指定appender的全限定名。日志输出目的,有ConsoleAppender(输出到控制台)、FileAppender(输出到文件)、SMTPAppender(输出到邮件)、
DBAppender(输出到数据库)、AsyncAppender(异步输出,包装其它具体的appender,不单独使用)等。

ConsoleAppender

把日志输出到控制台,有以下子节点:

  • <encoder>:对日志进行格式化。(具体参数稍后讲解 )
  • <target>:字符串System.out(默认)或者System.err(区别不多说了)
<configuration> 
   <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> 
      <encoder> 
         <pattern>%-4relative [%thread] %-5level %logger{35} - %msg %n</pattern> 
      </encoder> 
   </appender> 

   <root level="DEBUG"> 
      <appender-ref ref="STDOUT" /> 
   </root> 
</configuration>
FileAppender

把日志添加到文件,有以下子节点:

  • <file>:被写入的文件名,可以是相对目录,也可以是绝对目录,如果上级目录不存在会自动创建,没有默认值。
  • <append>:如果是 true,日志被追加到文件结尾,如果是 false,清空现存文件,默认是true。
  • <encoder>:对记录事件进行格式化。(具体参数稍后讲解 )
  • <prudent>:如果是 true,日志会被安全的写入文件,即使其他的FileAppender也在向此文件做写入操作,效率低,默认是 false。
<configuration> 
  <appender name="FILE" class="ch.qos.logback.core.FileAppender"> 
    <file>testFile.log</file> 
    <append>true</append> 
    <encoder> 
      <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern> 
    </encoder> 
  </appender> 

  <root level="DEBUG"> 
    <appender-ref ref="FILE" /> 
  </root> 
</configuration>
RollingFileAppender

滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件。有以下子节点:

  • <file>:被写入的文件名,可以是相对目录,也可以是绝对目录,如果上级目录不存在会自动创建,没有默认值。
  • <append>:如果是 true,日志被追加到文件结尾,如果是 false,清空现存文件,默认是true。
  • <rollingPolicy>:当发生滚动时,决定RollingFileAppender的行为,涉及文件移动和重命名。属性class定义具体的滚动策略类
          class=“ch.qos.logback.core.rolling.TimeBasedRollingPolicy”: 最常用的滚动策略,它根据时间来制定滚动策略,既负责滚动也负责出发滚动。有以下子节点:
  • <fileNamePattern>:必要节点,包含文件名及“%d”转换符,“%d”可以包含一个java.text.SimpleDateFormat指定的时间格式,如:%d{yyyy-MM}。
    如果直接使用 %d,默认格式是 yyyy-MM-dd。RollingFileAppender的file字节点可有可无,通过设置file,可以为活动文件和归档文件指定不同位置,当前日志总是记录到file指定的文件(活动文件),活动文件的名字不会改变;
    如果没设置file,活动文件的名字会根据fileNamePattern 的值,每隔一段时间改变一次。“/”或者“\”会被当做目录分隔符。
  • <maxHistory>:
    可选节点,控制保留的归档文件的最大数量,超出数量就删除旧文件。假设设置每个月滚动,且<maxHistory>是6,则只保存最近6个月的文件,删除之前的旧文件。注意,删除旧文件是,那些为了归档而创建的目录也会被删除。

class=“ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy”: 查看当前活动文件的大小,如果超过指定大小会告知RollingFileAppender 触发当前活动文件滚动。只有一个节点:

  • <maxFileSize>:这是活动文件的大小,默认值是10MB。

  • <prudent>:当为true时,不支持FixedWindowRollingPolicy。支持TimeBasedRollingPolicy,但是有两个限制,1不支持也不允许文件压缩,2不能设置file属性,必须留空。

  • <triggeringPolicy >: 告知 RollingFileAppender 合适激活滚动。
          class=“ch.qos.logback.core.rolling.FixedWindowRollingPolicy” 根据固定窗口算法重命名文件的滚动策略。有以下子节点:

  • <minIndex>:窗口索引最小值

  • <maxIndex>:窗口索引最大值,当用户指定的窗口过大时,会自动将窗口设置为12。

  • <fileNamePattern>:必须包含“%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}.log</fileNamePattern> 
         <maxHistory>30</maxHistory> 
      </rollingPolicy> 
      <encoder> 
         <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern> 
      </encoder> 
   </appender> 

   <root level="DEBUG"> 
      <appender-ref ref="FILE" /> 
   </root> 
</configuration>
<configuration> 
   <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> 
      <file>test.log</file> 

      <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy"> 
          <fileNamePattern>tests.%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>
AsyncAppender

异步添加日志,不单独使用,一般通过引用其它具体的appender来使用。如:

<!--异步记录日志,需引用其它的appender-->
<appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender">
    <appender-ref ref="FILE" />
</appender>
logger结点

设置某一包或类下的日志打印级别、appender。

<!--控制指定包或类的日志输出(包括等级和目的地), additivity表示日志信息是否向上传递,false为不传递(即不重复打印)-->
<logger name="com.dragon.study.log.Slf4jAndLogbackMainTwo" level="warn" additivity="false">
    <!--可多个appender-->
    <appender-ref ref="STDOUT" />
</logger>
root结点

指定日志级别及输出的appender,如:

<root level="info">
    <appender-ref ref="STDOUT" />
    <appender-ref ref="FILE" />
</root>
filter过滤器结点

通过实现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 %n</pattern>
    </encoder>
</appender>

另外过滤器还可以来自自带的或表达式直接写在配置文件中,如下:

<!--日志级别(针对具体指定级别)过滤器-->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
    <level>INFO</level>
    <onMatch>ACCEPT</onMatch>
    <onMismatch>NEUTRAL</onMismatch>
    <!--<onMismatch>DENY</onMismatch>-->
</filter>

<!--日志级别(针对指定级别及以上级别)过滤器-->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
    <!--<level>INFO</level>-->
    <level>WARN</level>
</filter>

<!--根据判断条件的过虑器-->
<filter class ="ch.qos.logback.core.filter.EvaluatorFilter">
    <evaluator >
        <!--expression为java代码,需要添加groupId为org.codehaus.janino,artifactId为janino的maven包-->
        <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>ACCEPT</onMatch>
    <onMismatch>DENY</onMismatch>
</filter>
pattern日志格式

定义每行日志记录的格式,官网地址: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%n</pattern>
            <!--简写形式-->
            <!--<pattern>%d %lo %C %M %le %t %le %lo : %m%n</pattern>-->
        </encoder>
    </encoder>
</appender>
  • 15
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值