SpringBoot配置log4j2日志及输出到文件中

一、java.util.logging、log4j、slf4j的区别

java.util.logging
java自带的日志实现类

log4j
比java.util.logging功能更加丰富的日志实现类
具体差别请看Log4j 对比 java.util.logging

而Log4j 2是Log4j的升级版本,Log4j 2相对于Log4j 1.x 有了很多显著的改善。

slf4j
日志的整体抽象层,可以任意切换使用多个日志相关jar包

Spring Boot 采用了 slf4j+logback 的组合形式,Spring Boot也提供对JUL、log4j2、Logback提供了默认配置

二、配置日志

引入log4j2日志

		<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
            <!-- 排除springboot默认的logback日志框架 -->
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-logging</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <!-- 引入日志依赖 自带slf4j-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-log4j2</artifactId>
        </dependency>

日志配置文件

使用方法

Logger log = LoggerFactory.getLogger(TestController.class);

log.info("get available prefix index file {}", codePrefixIndex);

三、指定输出文件

1.如果只是使用默认的logback ,只需要在application.properties中配置

############################################################
#
# 日志 配置
#
############################################################

# 配置日志的生成目录,只设置这个的话,系统默认生成的日志文件名为spring.log
#logging.path = mylog/

# 配置日志文件名和路径,系统推荐(如果logging.path和logging.file同时存在,只有logging.file有效)
#logging.file= mylog/myspring.log

2. 使用log4j2

根据日期分类

<?xml version="1.0" encoding="UTF-8"?>
<!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
<!--Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,你会看到log4j2内部各种详细输出 -->
<!--monitorInterval:Log4j能够自动检测修改配置 文件和重新配置本身,设置间隔秒数 -->
<configuration status="WARN" monitorInterval="1800">
    <Properties>
        <!-- 日志默认存放的位置,这里设置为项目根路径下,也可指定绝对路径 -->
        <!-- ${web:rootDir}是web项目根路径,java项目没有这个变量,需要删掉,否则会报异常 -->
        <property name="basePath">log4j2Logs</property>
        <!-- <property name="basePath">d:/qfxSpringMVCMybaitsDemoLogs</property> -->

        <!-- 控制台默认输出格式,"%-5level":日志级别,"%l":输出完整的错误位置,是小写的L,因为有行号显示,所以影响日志输出的性能 %t 输出产生该日志事件的线程名-->
        <property name="console_log_pattern">%d{yyyy-MM-dd HH:mm:ss.SSS}  %highlight{%-5level %l} -
            %m%n
        </property>

        <!-- 日志文件默认输出格式,不带行号输出(行号显示会影响日志输出性能);%C:大写,类名;%M:方法名;%m:错误信息;%n:换行 -->
        <property name="log_pattern">%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] %C.%M -
            %m%n
        </property>
        <!-- 日志默认切割的最小单位 -->
        <property name="every_file_size">20MB</property>
        <!-- 日志默认输出级别 -->
        <property name="output_log_level">DEBUG</property>



        <!-- 日志默认存放路径(所有级别日志) -->
        <property name="rolling_fileName">${basePath}/all.log</property>
        <!-- 日志默认压缩路径,将超过指定文件大小的日志,自动存入按"年月"建立的文件夹下面并进行压缩,作为存档 -->
        <property name="rolling_filePattern">${basePath}/time-based-logs/%d{yyyy-MM-dd}-all.log.zip
        </property>
        <!-- 日志默认同类型日志,同一文件夹下可以存放的数量,不设置此属性则默认为7个 -->
        <property name="rolling_max">50</property>



        <!-- Info日志默认存放路径(Info级别日志) -->
        <property name="info_fileName">${basePath}/info.log</property>
        <!-- Info日志默认压缩路径,将超过指定文件大小的日志,自动存入按"年月"建立的文件夹下面并进行压缩,作为存档 -->
        <property name="info_filePattern">${basePath}/time-based-logs/%d{yyyy-MM-dd}-info.log.zip
        </property>
        <!-- Info日志默认同一文件夹下可以存放的数量,不设置此属性则默认为7个 -->
        <property name="info_max">10</property>



        <!-- Warn日志默认存放路径(Warn级别日志) -->
        <property name="warn_fileName">${basePath}/warn.log</property>
        <!-- Warn日志默认压缩路径,将超过指定文件大小的日志,自动存入按"年月"建立的文件夹下面并进行压缩,作为存档 -->
        <property name="warn_filePattern">${basePath}/time-based-logs/%d{yyyy-MM-dd}-warn.log.zip
        </property>
        <!-- Warn日志默认同一文件夹下可以存放的数量,不设置此属性则默认为7个 -->
        <property name="warn_max">10</property>

        <!-- Error日志默认存放路径(Error级别日志) -->
        <property name="error_fileName">${basePath}/error.log</property>
        <!-- Error日志默认压缩路径,将超过指定文件大小的日志,自动存入按"年月"建立的文件夹下面并进行压缩,作为存档 -->
        <property name="error_filePattern">${basePath}/time-based-logs/%d{yyyy-MM-dd}-error.log.zip
        </property>
        <!-- Error日志默认同一文件夹下可以存放的数量,不设置此属性则默认为7个 -->
        <property name="error_max">10</property>

        <!-- 控制台显示的日志最低级别 -->
        <property name="console_print_level">DEBUG</property>


        <!-- druid日志默认存放路径(Error级别日志) -->
        <property name="druid_fileName">${basePath}/druid.log</property>
        <!-- druid日志默认压缩路径,将超过指定文件大小的日志,自动存入按"年月"建立的文件夹下面并进行压缩,作为存档 -->
        <property name="druid_filePattern">${basePath}/time-based-logs/%d{yyyy-MM-dd}-druid.log.zip
        </property>
        <!-- druid日志默认同一文件夹下可以存放的数量,不设置此属性则默认为7个 -->
        <property name="druid_max">10</property>

    </Properties>

    <!--定义appender -->
    <appenders>
        <!-- 用来定义输出到控制台的配置 -->
        <Console name="Console" target="SYSTEM_OUT">
            <!-- 设置控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch) -->
            <ThresholdFilter level="${console_print_level}" onMatch="ACCEPT" onMismatch="DENY"/>
            <!-- 设置输出格式,不设置默认为:%m%n -->
            <PatternLayout pattern="${console_log_pattern}"/>
        </Console>

        <!-- 打印root中指定的level级别以上的日志到文件 -->
        <RollingFile name="RollingFile" fileName="${rolling_fileName}"
                     filePattern="${rolling_filePattern}">
            <PatternLayout pattern="${log_pattern}"/>
            <Policies>
                <!-- jvm重启就进行一次rollover-->
                <OnStartupTriggeringPolicy />
                <!-- 文件大小达到20mb进行一次rollover -->
                <SizeBasedTriggeringPolicy size="20 MB" />
                <!-- TimeBasedTriggeringPolicy是最多用到的Policy,
                interval默认值是1,根据filePattern中日期的最小单位,例如
                在该配置里是mm(分钟),设置interval="2"则每隔两分钟将发生
                一次rollover,按当前配置,具体表现就是隔两分钟得到一个log.zip。
                modulate就是让第一次rollover发生在区间边界上(即便还没到
                interval的时长),按照当前配置,首次rollover会发生在比如
                8点50分0秒,这样之后的rollover就是8点52分0秒、8点54分0秒..
                这样做的好处在于rollover的时机就变得很有规律很好预测,生成的
                文件还很整齐(假设时间最小单位为天,interval="1",那么就
                变成稳定每天0点自动rollover了。。)。还有个属性叫maxRandomDelay,
                防止很多应用在同一时间一起rollover的,暂时不理它。
                  -->
                <TimeBasedTriggeringPolicy interval="1" modulate="true" />
                <!-- DefaultRolloverStrategy,默认rollover策略。参数:
                fileIndex有两个值,max和min,就是决定生成文件是从序号大的到
                序号小的,还是从序号小的到序号大。min,计数器的起始值,
                 默认是1;max,计数器的最大值,默认是7。还有两个参数暂时不管。-->
                <DefaultRolloverStrategy max="${info_max}">
                <Delete basePath="${basePath}/time-based-logs/" maxDepth="2">
                    <IfFileName glob="*.log.zip" />
                    <!--!Note: 这里的age必须和filePattern协调, 后者是精确到HH, 这里就要写成xH, xd就不起作用
                    另外, 数字最好>2, 否则可能造成删除的时候, 最近的文件还处于被占用状态,导致删除不成功!-->
                    <!--7天-->
                    <!--<IfLastModified age="168H" />-->
                    <!--1个月-->
                    <IfLastModified age="720H" />
                </Delete>
            </DefaultRolloverStrategy>
            </Policies>
            
        </RollingFile>

        <!-- 打印INFO级别的日志到文件 -->
        <RollingFile name="InfoFile" fileName="${info_fileName}"
                     filePattern="${info_filePattern}">
            <PatternLayout pattern="${log_pattern}"/>

            <!-- 匹配INFO级别 -->
            <Filters>
                <ThresholdFilter level="WARN" onMatch="DENY" onMismatch="NEUTRAL"/>
                <ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
            </Filters>
            <Policies>
                <!-- jvm重启就进行一次rollover-->
                <OnStartupTriggeringPolicy />
                <!-- 文件大小达到20mb进行一次rollover -->
                <SizeBasedTriggeringPolicy size="${every_file_size}" />
                <TimeBasedTriggeringPolicy interval="1" modulate="true" />
                <DefaultRolloverStrategy max="${info_max}"/>
            </Policies>
        </RollingFile>

        <!-- 打印WARN级别的日志到文件 -->
        <RollingFile name="WarnFile" fileName="${warn_fileName}"
                     filePattern="${warn_filePattern}">
            <PatternLayout pattern="${log_pattern}"/>
            <!-- 匹配WARN级别 -->
            <Filters>
                <ThresholdFilter level="ERROR" onMatch="DENY" onMismatch="NEUTRAL"/>
                <ThresholdFilter level="WARN" onMatch="ACCEPT" onMismatch="DENY"/>
            </Filters>
            <Policies>
                <!-- jvm重启就进行一次rollover-->
                <OnStartupTriggeringPolicy />
                <!-- 文件大小达到20mb进行一次rollover -->
                <SizeBasedTriggeringPolicy size="${every_file_size}" />
                <TimeBasedTriggeringPolicy interval="1" modulate="true" />
                <DefaultRolloverStrategy max="${info_max}"/>
            </Policies>
        </RollingFile>

        <!-- 打印ERROR级别的日志到文件 -->
        <RollingFile name="ErrorFile" fileName="${error_fileName}"
                     filePattern="${error_filePattern}">
            <PatternLayout pattern="${log_pattern}"/>
            <!-- 匹配ERROR级别 -->
            <Filters>
                <ThresholdFilter level="FATAL" onMatch="DENY" onMismatch="NEUTRAL"/>
                <ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/>
            </Filters>
            <Policies>
                <!-- jvm重启就进行一次rollover-->
                <OnStartupTriggeringPolicy />
                <!-- 文件大小达到20mb进行一次rollover -->
                <SizeBasedTriggeringPolicy size="${every_file_size}" />
                <TimeBasedTriggeringPolicy interval="1" modulate="true" />
                <DefaultRolloverStrategy max="${info_max}"/>
            </Policies>
        </RollingFile>

        <!--druid的日志记录追加器-->
        <RollingFile name="druidSqlRollingFile" fileName="${druid_fileName}"
                     filePattern="${druid_filePattern}">
            <PatternLayout pattern="${druid_pattern}"/>
            <Policies>
                <!-- jvm重启就进行一次rollover-->
                <OnStartupTriggeringPolicy />
                <!-- 文件大小达到20mb进行一次rollover -->
                <SizeBasedTriggeringPolicy size="${every_file_size}" />
                <TimeBasedTriggeringPolicy interval="1" modulate="true" />
                <DefaultRolloverStrategy max="${info_max}"/>
            </Policies>
        </RollingFile>
    </appenders>

    <!--然后定义logger,只有定义了logger并引入的appender,appender才会生效 -->
    <loggers>

        <!--log4j2 自带过滤日志-->
        <Logger name="org.apache.catalina.startup.DigesterFactory" level="error" />
        <Logger name="org.apache.catalina.util.LifecycleBase" level="error" />
        <Logger name="org.apache.coyote.http11.Http11NioProtocol" level="warn" />
        <logger name="org.apache.sshd.common.util.SecurityUtils" level="warn"/>
        <Logger name="org.apache.tomcat.util.net.NioSelectorPool" level="warn" />
        <Logger name="org.crsh.plugin" level="warn" />
        <logger name="org.crsh.ssh" level="warn"/>
        <Logger name="org.eclipse.jetty.util.component.AbstractLifeCycle" level="error" />
        <Logger name="org.hibernate.validator.internal.util.Version" level="warn" />
        <logger name="org.springframework.boot.actuate.autoconfigure.CrshAutoConfiguration" level="warn"/>
        <logger name="org.springframework.boot.actuate.endpoint.jmx" level="warn"/>
        <logger name="org.thymeleaf" level="warn"/>


        <!-- 设置对打印sql语句的支持 -->
        <logger name="java.sql" level="debug" additivity="false">
            <appender-ref ref="Console"/>
        </logger>

        <!--记录druid-sql的记录-->
        <logger name="druid.sql.Statement" level="debug" additivity="false">
            <appender-ref ref="druidSqlRollingFile"/>
        </logger>

        <!--建立一个默认的root的logger -->
        <root level="${output_log_level}">
            <appender-ref ref="RollingFile"/>
            <appender-ref ref="Console"/>
            <appender-ref ref="InfoFile"/>
            <appender-ref ref="WarnFile"/>
            <appender-ref ref="ErrorFile"/>
        </root>
    </loggers>
</configuration>

四、控制台日志添加颜色

4.1 修改Intellj IDEA配置

Run —> Edit Configurations —>Environment,在VM options中添加
-Dlog4j.skipJansi=false

4.2 添加高亮

上述的console_log_pattern中,添加%highlight {} 被括起来的都会有颜色

<property name="console_log_pattern">%d{yyyy-MM-dd HH:mm:ss.SSS}  %highlight{%-5level %l} -
            %m%n
</property>

五、定期删除日志文件

<DefaultRolloverStrategy>
    <Delete basePath="${basePath}/time-based-logs/" maxDepth="2">
        <IfFileName glob="*.log.zip" />
        <!--!Note: 这里的age必须和filePattern协调, 后者是精确到HH, 这里就要写成xH, xd就不起作用
        另外, 数字最好>2, 否则可能造成删除的时候, 最近的文件还处于被占用状态,导致删除不成功!-->
        <!--只保留7天内日志压缩包-->
        <!--<IfLastModified age="168H" />-->
        <!--只保留一个月内日志压缩包-->
        <IfLastModified age="720H" />
    </Delete>
</DefaultRolloverStrategy>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值