logback同步和异步混合输出配置

文件名logback-spring.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">

    <contextName>${app_name}</contextName>
    <!-- 读取application.properties中定义的配置项 -->
    <springProperty name="app_name" scope="context" source="spring.application.name"/>
    <!-- 日志级别 -->
    <!--    <springProperty scope="context" name="logLevel" source="logging.level"/>-->
    <springProperty scope="context" name="logPath" source="logging.path"
                    defaultValue="../logs"/>
    <!-- 日志最大的历史 7天 -->
    <springProperty scope="context" name="log.maxHistory" source="logging.maxHistory"/>
    <!-- 日志打输出规范 -->
    <springProperty scope="context" name="log.pattern" source="logging.pattern"/>

    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${log.pattern}</pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <!-- INFO 级别的日志-->
    <appender name="infoAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 文件路径 -->
        <file>${logPath}/info.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!-- 文件名称-->
            <fileNamePattern>${logPath}/info.%d{yyyy-MM-dd}.log.%i</fileNamePattern>
            <!-- 文件最大保存历史数量 -->
            <maxHistory>${log.maxHistory}</maxHistory>
            <maxFileSize>300MB</maxFileSize>
            <totalSizeCap>10GB</totalSizeCap>
        </rollingPolicy>
        <encoder>
            <pattern>${log.pattern}</pattern>
            <charset>UTF-8</charset>
        </encoder>

        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>
    <!-- WARN 级别的日志-->
    <appender name="warnAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 文件路径 -->
        <file>${logPath}/warn.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!-- 文件名称 -->
            <fileNamePattern>${logPath}/warn.log.%d{yyyy-MM-dd}.%i</fileNamePattern>
            <!-- 文件最大保存历史数量 -->
            <maxHistory>${log.maxHistory}</maxHistory>
            <maxFileSize>300MB</maxFileSize>
            <totalSizeCap>3GB</totalSizeCap>
        </rollingPolicy>
        <encoder>
            <pattern>${log.pattern}</pattern>
            <charset>UTF-8</charset>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>WARN</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>
    <!-- ERROR 级别的日志-->
    <appender name="errorAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 文件路径 -->
        <file>${logPath}/error.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!-- 文件名称 -->
            <fileNamePattern>${logPath}/error.log.%d{yyyy-MM-dd}.%i</fileNamePattern>
            <!-- 文件最大保存历史数量 -->
            <maxHistory>${log.maxHistory}</maxHistory>
            <maxFileSize>300MB</maxFileSize>
            <totalSizeCap>2GB</totalSizeCap>
        </rollingPolicy>
        <encoder>
            <pattern>${log.pattern}</pattern>
            <charset>UTF-8</charset>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!-- vip 日志-->
    <appender name="vipAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 文件路径 -->
        <file>${logPath}/vip.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!-- 文件名称 -->
            <fileNamePattern>${logPath}/vip.%d{yyyy-MM-dd}.log.%i</fileNamePattern>
            <!-- 文件最大保存历史数量 -->
            <maxHistory>${log.maxHistory}</maxHistory>
            <maxFileSize>200MB</maxFileSize>
            <totalSizeCap>5GB</totalSizeCap>
        </rollingPolicy>
        <encoder>
            <pattern>%msg%n</pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <logger name="vip" level="${logLevel}" additivity="false">
        <appender-ref ref="vipAppender"/>
    </logger>

    <!-- 推送埋点日志,最终用于对外查询的数据源-->
    <appender name="point" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 文件路径 -->
        <file>${logPath}/point.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!-- 文件名称 -->
            <fileNamePattern>${logPath}/point.%d{yyyy-MM-dd}.log.%i</fileNamePattern>
            <!-- 文件最大保存历史数量 -->
            <maxHistory>${log.maxHistory}</maxHistory>
            <maxFileSize>200MB</maxFileSize>
            <totalSizeCap>5GB</totalSizeCap>
        </rollingPolicy>
        <encoder>
            <pattern>%msg%n</pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <!-- 异步输出 -->
    <appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender">
        <!-- 默认如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志,若要保留全部日志,设置为0 -->
        <discardingThreshold>0</discardingThreshold>
        <!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->
        <queueSize>512</queueSize>
        <!-- 往队列添加时,是否block,默认false[blockingQueue.put],当队列满了后需要等待;如果设为true[blockingQueue.offer],不等待,直接丢弃数据 -->
        <neverBlock>false</neverBlock>
        <!--是否打印调用方信息-->
        <includeCallerData>false</includeCallerData>
        <!-- 添加附加的appender,最多只能添加一个 -->
        <appender-ref ref="point"/>
    </appender>

    <logger name="point_log" level="INFO" additivity="false">
        <appender-ref ref="ASYNC"/>
    </logger>

    <logger name="com.apache.ibatis" level="WARN"/>
    <logger name="java.sql.Connection" level="WARN"/>
    <logger name="java.sql.Statement" level="WARN"/>
    <logger name="java.sql.PreparedStatement" level="WARN"/>
    <logger name="org.springframework" level="INFO"/>
    <logger name="org.apache.zookeeper" level="WARN"/>
    <logger name="com.lambdaworks.redis" level="INFO"/>
    <logger name="org.apache.kafka" level="INFO"/>

    <!-- root级别   INFO -->
    <root level="INFO">
        <!-- 控制台输出 -->
        <appender-ref ref="STDOUT"/>
        <appender-ref ref="errorAppender"/>
        <appender-ref ref="infoAppender"/>
        <appender-ref ref="warnAppender"/>
    </root>
</configuration>

  maven依赖

<!-- https://mvnrepository.com/artifact/ch.qos.logback/logback-core -->
            <dependency>
                <groupId>ch.qos.logback</groupId>
                <artifactId>logback-core</artifactId>
                <version>1.2.11</version>
            </dependency>
            <!-- https://mvnrepository.com/artifact/ch.qos.logback/logback-classic -->
            <dependency>
                <groupId>ch.qos.logback</groupId>
                <artifactId>logback-classic</artifactId>
                <version>1.2.11</version>
            </dependency>
            <!-- https://mvnrepository.com/artifact/ch.qos.logback/logback-access -->
            <dependency>
                <groupId>ch.qos.logback</groupId>
                <artifactId>logback-access</artifactId>
                <version>1.2.11</version>
            </dependency>

  系统关闭的回调钩子

@Component
public class LogPointHelper implements ServletContextListener {

    /**
     *关闭logger
     */
    public void contextDestroyed(ServletContextEvent sce) {
        LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();
        loggerContext.stop();
    }
}

  中文文档:https://logbackcn.gitbook.io/logback/

posted @ 2022-06-30 12:06  CodingChangeTheWorld  阅读(540)  评论(0编辑  收藏  举报