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();
    
        }
    }
  • 相关阅读:
    ACM的算法分类 2015-04-16 14:25 22人阅读 评论(0) 收藏
    初学Larevel 2014-08-21 11:24 90人阅读 评论(0) 收藏
    初学PHP&MySQL 2014-05-31 12:40 92人阅读 评论(0) 收藏
    codeforces 570 E. Pig and Palindromes (dp)
    codeforces 570 D. Tree Requests (dfs序)
    poj 2157 Maze (bfs)
    cf 570 C. Replacement (暴力)
    cf 570B B. Simple Game(构造)
    cf 570 A. Elections
    hdu 1429胜利大逃亡(续) (bfs+状态压缩)
  • 原文地址:https://www.cnblogs.com/liuyiyuan/p/13160476.html
Copyright © 2011-2022 走看看