zoukankan      html  css  js  c++  java
  • 使用SLF4J作为门面简单配置日志

    引入pom依赖,slf4j为日志门面,简单理解为一个日志接口,本身没有实现不会输出什么,常用的实现有logback、log4j等,这里也引入了它们的依赖

        <dependency>
          <groupId>org.slf4j</groupId>
          <artifactId>slf4j-api</artifactId>
          <version>1.7.21</version>
        </dependency>
        <!--  日志实现  logback 依赖  -->
    <!--    <dependency>-->
    <!--      <groupId>ch.qos.logback</groupId>-->
    <!--      <artifactId>logback-classic</artifactId>-->
    <!--      <version>1.1.8</version>-->
    <!--    </dependency>-->
    
    <!--  日志实现  log4j  依赖  -->
        <dependency>
          <groupId>org.slf4j</groupId>
          <artifactId>slf4j-log4j12</artifactId>
          <version>1.7.21</version>
        </dependency>

    logback.xml配置:

    <?xml version="1.0" encoding="UTF-8"?>
    <configuration scan="true" scanPeriod="60 seconds" debug="false">
        <!-- 定义参数常量 -->
        <!-- 日志级别 TRACE<DEBUG<INFO<WARN<ERROR -->
        <!-- logger.trace("msg") logger.debug... -->
        <property name="log.level" value="INFO"/>
        <property name="log.maxHistory" value="60"/>
        <property name="log.filePath" value="logs"/>
        <property name="log.pattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n"/>
        <!-- 控制台输出设置 -->
        <appender name="consoleAppender" class="ch.qos.logback.core.ConsoleAppender">
            <encoder>
                <pattern>${log.pattern}</pattern>
            </encoder>
        </appender>
        <!-- DEBUG级别文件记录 -->
        <appender name="debugAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <!-- 文件路径 -->
            <file>${log.filePath}/sys-debug.log</file>
            <!-- 循环策略:基于时间创建日志文件 -->
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <!-- 日志文件名称 .gz表示压缩 -->
                <fileNamePattern>${log.filePath}/debug/sys-debug.%d{yyyy-MMdd}.log.gz</fileNamePattern>
                <!-- 日志文件最大保存历史 60天-->
                <maxHistory>${log.maxHistory}</maxHistory>
            </rollingPolicy>
            <encoder>
                <pattern>${log.pattern}</pattern>
            </encoder>
            <filter class="ch.qos.logback.classic.filter.LevelFilter">
                <!--  过滤的级别  -->
                <level>DEBUG</level>
                <!--  匹配时的操作:接收(记录)  -->
                <onMatch>ACCEPT</onMatch>
                <!--  不匹配时的操作:拒绝(不记录)  -->
                <onMismatch>DENY</onMismatch>
            </filter>
        </appender>
        <!-- INFO -->
        <appender name="infoAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <!-- 文件路径 -->
            <file>${log.filePath}/sys-info.log</file>
            <!-- 循环策略:基于时间创建日志文件 -->
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <!-- 日志文件名称 -->
                <fileNamePattern>${log.filePath}/info/sys-info.%d{yyyy-MM-dd}.log.gz</fileNamePattern>
                <!-- 日志文件最大保存历史 60天-->
                <maxHistory>${log.maxHistory}</maxHistory>
            </rollingPolicy>
            <encoder>
                <pattern>${log.pattern}</pattern>
            </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>${log.filePath}/sys-warn.log</file>
            <!-- 循环策略:基于时间创建日志文件 -->
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <!-- 日志文件名格式  -->
                <fileNamePattern>${log.filePath}/warn/sys-error.%d{yyyy-MM-dd}.log.gz</fileNamePattern>
                <!-- 日志最大的历史 60天 -->
                <maxHistory>${log.maxHistory}</maxHistory>
            </rollingPolicy>
            <encoder>
                <pattern>${log.pattern}</pattern>
            </encoder>
            <filter class="ch.qos.logback.classic.filter.LevelFilter">
                <!-- 过滤的级别 -->
                <level>WARN</level>
                <!-- 匹配时的操作:接收(记录) -->
                <onMatch>ACCEPT</onMatch>
                <!-- 不匹配时的操作:拒绝(不记录) -->
                <onMismatch>DENY</onMismatch>
            </filter>
        </appender>
        <!--  ERRO  -->
        <appender name="errorAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <!-- 文件路径 -->
            <file>${log.filePath}/sys-error.log</file>
            <!-- 循环策略:基于时间创建日志文件 -->
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <!-- 日志文件名格式  -->
                <fileNamePattern>${log.filePath}/error/sys-error.%d{yyyy-MM-dd}.log.gz</fileNamePattern>
                <!-- 日志最大的历史 60天 -->
                <maxHistory>${log.maxHistory}</maxHistory>
            </rollingPolicy>
            <encoder>
                <pattern>${log.pattern}</pattern>
            </encoder>
            <filter class="ch.qos.logback.classic.filter.LevelFilter">
                <!-- 过滤的级别 -->
                <level>ERROR</level>
                <!-- 匹配时的操作:接收(记录) -->
                <onMatch>ACCEPT</onMatch>
                <!-- 不匹配时的操作:拒绝(不记录) -->
                <onMismatch>DENY</onMismatch>
            </filter>
        </appender>
    
        <!--
          项目包开头的日志对应形式
          level表示日志接收级别,如果不设置则继承上级即root的级别
          additivity="true" 表示将日志信息向上级传递,即传递给root,默认值就是true
          不配置appender表示不打印日志,将日志交给上级处理
        -->
        <logger name="top.lyylzt" level="${log.level}" additivity="true">
            <appender-ref ref="debugAppender"/>
        </logger>
        <!-- Spring日志级别控制  -->
        <logger name="org.springframework" level="warn" additivity="true"/>
    
        <!-- <root> 是必选节点,用来指定最基础的日志输出级别,只有一个level属性 -->
        <root level="info">
            <appender-ref ref="consoleAppender"/>
        </root>
        <root level="info">
            <appender-ref ref="infoAppender"/>
            <appender-ref ref="warnAppender"/>
            <appender-ref ref="errorAppender"/>
        </root>
    
        <!-- MyBatis sql日志 -->
        <appender name="MyBatis" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <file>${log.filePath}/sql_log/mybatis-sql.log</file>
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <FileNamePattern>${log.filePath}/sql_log/mybatis-sql.%d{yyyy-MM-dd}.log</FileNamePattern>
                <maxHistory>${log.maxHistory}</maxHistory>
            </rollingPolicy>
            <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
                <pattern>%thread|%d{yyyy-MM-dd HH:mm:ss.SSS}|%level|%logger{36}|%m%n
                </pattern>
            </encoder>
        </appender>
        <!-- 捕捉sql-log开头的日志,默认info级别表示不打印sql日志,需要在mybatis配置文件中给打印的日志添加 sql-log. 前缀(注意这个点一定要加)-->
        <logger name="sql-log" level="INFO" additivity="true">
            <appender-ref ref="MyBatis"/>
        </logger>
    </configuration>

    如果是SpringBoot工程,则在 application.properties 中可以用配置修改logger的输出级别:

    logging.level.top.lyylzt=debug
    logging.level.org.springframework=warn
    logging.level.sql-log=debug
    logging.level.root=info

    log4j.properties配置:

    # 全局日志配置
    log4j.rootLogger=ERROR, stdout
    # 指定包下的日志输出级别
    log4j.logger.xyz.lyuan=INFO
    
    log4j.appender.stdout=org.apache.log4j.ConsoleAppender
    log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
    log4j.appender.stdout.layout.ConversionPattern=%d %5p [%t]  %l - %m %n

    在代码中要使用slf4j的api,通过切换pom依赖项就可以切换实际的日志实现了

    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    public class App {
        private static Logger logger = LoggerFactory.getLogger(App.class);
        public static void main(String[] args) {
    
            logger.trace("TRACE----");
            logger.debug("debug----");
            logger.info("info----");
            logger.warn("warn----");
            logger.error("error----");
    
            new Thread(() -> {
                logger.trace("TRACE----");
                logger.debug("debug----");
                logger.info("info----");
                logger.warn("warn----");
                logger.error("error----");
            }, "thread-name3423423432423423").start();
    
        }
    }
  • 相关阅读:
    AtCoder Regular Contest 066 F Contest with Drinks Hard
    AtCoder Grand Contest 002 D
    AtCoder Regular Contest 076 F
    AtCoder Grand Contest 004 C
    AtCoder Regular Contest 067 F
    转载:Unity3D游戏对象消失enabled、Destroy与active的区别
    Unity3d-AngryBots实例解读
    本类对象的引用作为参数,可以直接访问其私有成员
    构建完全二叉树、控制台打印二叉树
    转载:C++类内存分布
  • 原文地址:https://www.cnblogs.com/liuyiyuan/p/13160476.html
Copyright © 2011-2022 走看看