前言

本文基于以下扩展(点击即可查看):

Logback:同时按照日期和大小分割日志(最新日志可以不带日期或数字) 

logback配置

<?xml version="1.0" encoding="UTF-8"?>
<!-- 从高到地低 OFF 、 FATAL 、 ERROR 、 WARN 、 INFO 、 DEBUG 、 TRACE 、 ALL -->
<!-- 日志输出规则  根据当前ROOT 级别,日志输出时,级别高于root默认的级别时  会输出 -->
<!-- 以下 每个配置的 filter 是过滤掉输出文件里面,会出现高级别文件,依然出现低级别的日志信息,通过filter 过滤只记录本级别的日志-->

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

    <!--定义日志文件的存储地址 -->
    <property name="LOG_HOME" value="/usr/csizg/tomcat-log/DenseTubeManage" />

    <!-- 控制台输出 -->
	<appender name="ConsoleLog" class="ch.qos.logback.core.ConsoleAppender">
	<encoder>
		<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
		<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
		<charset>UTF-8</charset>
	</encoder>
	</appender>

    <!--Info文件输出-->
	<!-- 按照每天和固定大小(5MB)生成日志文件【最新的日志,是日期最大数字最大的】 -->
	 <appender name="FileInfoLog"  class="ch.qos.logback.core.rolling.RollingFileAppender">
         <!--如果只是想要 Info 级别的日志,只是过滤 info 还是会输出 Error 日志,因为 Error 的级别高,
       所以我们使用下面的策略,可以避免输出 Error 的日志,这种方式不能避免warn-->
         <!-- 过滤日志 -->
         <!--<filter class="ch.qos.logback.classic.filter.LevelFilter">
             &lt;!&ndash;过滤 Error&ndash;&gt;
             <level>ERROR</level>
             &lt;!&ndash;匹配到就禁止&ndash;&gt;
             <onMatch>DENY</onMatch>
             &lt;!&ndash;没有匹配到就允许&ndash;&gt;
             <onMismatch>ACCEPT</onMismatch>
         </filter>-->

         <!--只输出INFO-->
         <filter class="ch.qos.logback.classic.filter.LevelFilter">
             <!--过滤 INFO-->
             <level>INFO</level>
             <!--匹配到就禁止-->
             <onMatch>ACCEPT</onMatch>
             <!--没有匹配到就允许-->
             <onMismatch>DENY</onMismatch>
         </filter>


         <!--滚动策略-->
         <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
             <!--日志文件输出的文件名-->
             <FileNamePattern>${LOG_HOME}/Info/DenseTubeManage_Info_%d{yyyy-MM-dd}.%i.log</FileNamePattern>
             <!--日志文件保留天数-->
             <MaxHistory>30</MaxHistory>
             <!--日志文件最大的大小-->
             <MaxFileSize>5MB</MaxFileSize>
         </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>
             <charset>UTF-8</charset>
         </encoder>
     </appender>

    <!--Error文件输出-->
    <!-- 按照每天和固定大小(5MB)生成日志文件【最新的日志,是日期最大数字最大的】 -->
    <appender name="FileErrorLog"  class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <!--设置日志级别,过滤掉info日志,只输入error日志-->
            <level>ERROR</level>
        </filter>
        <!--滚动策略-->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!--日志文件输出的文件名-->
            <FileNamePattern>${LOG_HOME}/Error/DenseTubeManage_Error_%d{yyyy-MM-dd}.%i.log</FileNamePattern>
            <!--日志文件保留天数-->
            <MaxHistory>30</MaxHistory>
            <!--日志文件最大的大小-->
            <MaxFileSize>5MB</MaxFileSize>
        </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>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <!--日志等级设置-->
	<logger name="org.springframework" level="error"></logger>

	<root level="info">
        <appender-ref ref="ConsoleLog"/>
	</root>

    <logger name="com.csizg" level="info">
        <appender-ref ref="FileInfoLog"/>
        <appender-ref ref="FileErrorLog"/>
    </logger>

</configuration>

/说明

 Linux中根目录用/表示。而windows表示目录的方式与Linux有所不同,Windows下有磁盘分区的概念,而Linux下只有目录的概念,所以‘/’所表示的意义在两个系统中有所不同。
   
   ‘/’在linux中表示根目录。在Linux系统中,除根目录(root)以外,所有文件和目录都包含在相应的目录文件中。Linux文件系统采用带链接的树形目录结构,即只有一个根目录(通常用“/”表示),其中含有下级子目录或文件的信息;子目录中又可含有更下级的子目录或者文件的信息。这样一层一层地延伸下去,构成一棵倒置的树。    

   ‘/’在windows中也表示根目录,但此跟目录非彼根目录。windows对磁盘分区后会有多个磁盘,通常系统会装在C盘。windows有多个磁盘所以就会有‘多个根目录’,在dos命令模式下,在D盘的某文件夹中输入‘cd/’命令回车后会直接回到D盘的根目录。其它磁盘下也会回到该磁盘的目录。在哪个磁盘下使用‘/’,它就表示哪个磁盘的根目录

测试类

import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
 * @Title: Logback测试
 * @ClassName: com.csizg.logback.LogbackTest.java
 * @Description:
 *
 * @Copyright 2019   Powered By 研发中心
 * @author: FLY
 * @date:  2019-04-03 16:56
 * @version V1.0
 */
//@Slf4j
public class LogbackTest {

    private final static Logger log = LoggerFactory.getLogger(LogbackTest.class);

    @Test
    public void LogLevelTest(){

        log.debug("debug日志");
        log.info("info日志");
        log.warn("warn日志");
        log.error("error日志");
    }
}

输出效果:

Error日志

Info日志

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐