springboot中的log4j日志知识以及logback案例

日志
(1)使用原因
开发阶段发现程序的问题 , 排除错误 , 产品阶段 , 可以记录系统运行的一些状态信息 , 程序运行的状态 
(2)常见的日志框架
  log4j,slf4j,logback(springboot)
(3)日志的主要组成部分
      1 . loggers : 负责捕获记录信息(日志信息) ;
       2 . appenders : 负责发布日志信息 , 以不同的首选目的地 (日志的输出位置)
       3 . layouts : 负责格式化不同风格的日志信息 (日志输出格式)
(4)日志的级别(从低到高)
      ALL : 各级包括自定义级别 ;
      TRACE : 指定细粒度比DEBUG更低的信息事件 ;
      DEBUG : 调试级别 ;
      INFO : 表明消息在粗粒度级别上突出强调应用程序是非常有帮助的 , 也就是输出一些提示信息 ;
      WARN : 输出潜在的有可能出错的情形 , 也就是输出警告信息 ;
      ERROR : 指出发生的不影响系统继续运行的错误信息 ;
      FATAL : 指出严重的错误 , 这些错误将会导致系统终止运行 ;
      OFF : 为最高级别 , 用于关闭所有日志信息的输出 ;
核心规则 : log4j只会输出级别大于或者等于指定级别的信息 ;
(5)实现方式
通过属性(*.properties)文件定义
(6)语法
        6.1 . 配置根Logger , 语法为 :
           log4j.rootLogger = [ level ] , appenderName , appenderName ……
       注意 : 1 . 虽然罗列了很多级别 , 但log4j推荐只使用四个级别 , 优先级从高到低分别是ERROR , WARN , INFO , DEBUG ; 
                 2 . appenderName指的是日志输出的地址 , 可以同时指定n个 ;
   实例:
    log4j.rootLogger = debug,stdout,D,E
    
      6. 2 . 配置日志输出的目的地Appender以及每个输出文件的各项属性 , 语法为 :
            log4j.appender.appenderName =appender的值
            log4j.appender.appenderName.option1 = value1
  实例:
### 输出信息到控制抬 ###
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out

       注意 : log4j中提供的appender有以下几种 :
                1 . org.apache.log4j.ConsoleAppender(控制台) ;
                2 . org.apache.log4j.FileAppender(文件) ;
                3 . org.apache.log4j.DailyRollingFileAppender(按照一定的频度滚动产生日志记录文件 , 默认每天产生一个文件) ;
                4 . org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件) 
                5 . org.apache.log4j.WriterAppender(将日志信息以流格式发送到指定的位置) ;

        6.3 . 配置日志信息的格式或者布局layout以及布局的各项属性 , 语法为 :

            log4j.appender.appenderName.layout =layout的值
            log4j.appender.appenderName.layout.option1 = value
实例:
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n

       注意 : log4j中提供的layout有以下几种 :

               1 . org.apache.log4j.HTMLLayout(以HTML表格形式布局) ; 
               2 . org.apache.log4j.PatternLayout(可以灵活的指定布局模式 , 需要配置layout.ConversionPattern属性) ;
               3 . org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串) ; 
               4 . org.apache.log4j.TTCCLayout(包含日志产生的时间 , 线程 , 类别等等信息) ;

(7) 控制台选项

     1 . log4j.appender.appenderName.Threshold = error

           用法 : rootLogger里配置debug , 然后某个文件专门存储error以及更高级别的错误信息 , 那么就在这个配置这个文件的时候指定Threshold属性为error ;

       2 . log4j.appender.appenderName.ImmediateFlush=true
           用法 : 默认值是true , 意味着所有的消息都会被立即输出 , false则是不输出 ;

       3 . log4j.appender.appenderName.target=System.out
           用法 : 默认值为System.out , 输出到控制台 , 还可以取值System.err , 当做错误信息输出 , 输出的信息全部为红色 ;

       4 . log4j.appender.appenderName.File=../../../../logs/log.appenderName.txt
           用法 : 指定日志输出到指定位置 , 用的是相对于配置文件根目录的相对路径 ;

       5 . log4j.appender.appenderName.File.Append=true
           用法 : 默认值是true , 即将消息追加到指定文件中 , 如果取值为false , 则会覆盖之前的日志内容 ;

       6 . log4j.appender.appenderName.MaxFileSize=20MB
           用法 : 后缀可以是KB , MB , GB , 当日志文件的大小到达指定大小后 , 将会自动滚动 , 即将原来的内容移到fileName.1文件中 , 用记事本打开该文件即可看到原来的内容 , 改属性只能在 appender=org.apache.log4j.RollingFileAppender 时使用 ;

       7 . log4j.appender.appenderName.MaxBackupIndex=10
           用法 : 指定可以产生滚动文件的最大数量 , 与RollingFileAppender和MaxFileSize属性一起使用 , 当MaxBackupIndex=n的时候 , 最大日志存在数量为n+1 , 即log.txt , log.txt.1 , ... , log.txt.n , 当在服务器上运行的时候 , 如果对日志数量没有限制 , 那么随之时间的推移 , 日志文件会越来越多 , 占用的内存也将越来越多 , 直到占满整个盘 ;

       8 . log4j.appender.appenderName.DatePattern='.'yyyy-MM-dd
           用法 : 该属性在 log4j.appender.appenderName=org.apache.log4j.DailyRollingFileAppender 时使用 , DailyRollingFileAppender默认的频度是每天产生一个日志记录文件 , 可以在DatePattern属性值中指定其他的频度 , 常用的几个频度如下 :

            1 . '.'yyyy-MM : 每月产生一个日志记录文件 ;
            2 . '.'yyyy-ww : 每周产生一个日志记录文件 ;
            3 . '.'yyyy-MM-dd : 每天产生一个日志记录文件 ;
            4 . '.'yyyy-MM-dd-a : 每半天产生一个日志记录文件 ;
            5 . '.'yyyy-MM-dd-HH : 每小时产生一个日志记录文件 ;
            6 . '.'yyyy-MM-dd-HH-mm : 每分钟产生一个日志记录文件 ;

            注意 : 该属性指定值之后 , 将会按照指定的频度来生成日志记录文件 , 假设指定生成一个名为 log.txt 的文件 , 频度指定为每分钟产生一个日志记录文件 , 当达到指定频度后 , 会将log.txt文件中记录的之前的日志记录 , 重新写入一个名为 log.txt.yyyy-MM-dd-HH-mm的文件中 , 而此时 log.txt 文件中存放的是新生成的日志信息 , 该过程循环往复 ;

(8) ConversionPattern参数

答 : 假设当前java文件名为Test , 所在包名为log4j :

       1 . %c : 显示当前logger空间全称 , 例如 : log4j.Test ;

            %c{层数} : 最内层的java文件为第一层 , 例如 : %c{1} , 显示为Test , 当层数大于实际存在的最大层数时 , 显示最大实际存在层数 ;
       2 . %10c : 若名字空间长度小于10 , 则在左边将欠缺的长度用空格补齐 , 该种情况为默认的右对齐方式 ;
            %-10c : 若名字空间长度小于10 , 则在右边将欠缺的长度用空格补齐 , 该种情况为默认的左对齐方式 ;
       3 . %.3c : 从空间名最右边开始显示指定的长度 , 超出该长度的部分将被截取 ;
       4 . %10.15c : 若空间名长度小于10 , 则左边将欠缺的长度用空格补齐 , 若长度超过15 , 则将多余部分截取 ;
       5 . %-10.15c : 若空间名长度小于10 , 则右边将欠缺的长度用空格补齐 , 若长度超过15 , 则将多余部分截取 ;
       6 . %d : 显示日志记录时间 , 默认时间格式为ISO8601定义的日期格式 ;
            %d{yyyy-MM-dd HH:mm:ss} : 按照指定的时间格式显示日期 ;
       7 . %d{ABSOLUTE} : 22:15:30,076 ;
            %d{DATE} : 12 Oct 2018 22:15:30,076 ;
            %d{ISO8601} : 2018-07-20 22:23:30,076 ;
       8. %F : 显示调用logger的源文件名 , 例如 : Test.java ;
       9 . %l : 输出日志事件的发生位置 , 包括类目名 , 发生的线程 , 以及在代码中的行数 , 例如 : log4j.log4jTest.main(log4jTest.java:40) ;
       10: %m : 显示输出消息 ;
       11 . %M : 显示调用logger的方法名 ;
       12 . %n : 换行符 ;
       13 : %p : 显示该条目的优先级 ; 
       14 . %r : 显示从程序启动时到记录该条日志时已经经过的时间 , 单位毫秒 ;
       15 . %t : 显示产生该日志条目的线程名 ;
       16 . %x :NDC(Nested Diagnostic Context , 线程堆栈) : 顺序输出日志 ;
              %X :MDC(Mapped Diagnostic Context , 线程映射表)输出日志 , 通常用于多个客户端连接同一个服务器 , 方便服务器区分是哪个客户端访问留下来的日志 ;
       17 . %% : 显示一个百分号 ;

(9) LevelRangeFilter(分级过滤器): 如果想要实现不同级别的日志分别输出到不同的位置 , 可以在properties配置文件中加入如下语句进行限制 , 例如 :

       log4j.appender.appenderName.Threshold=debug
       log4j.appender.appenderName.filter.filterName=org.apache.log4j.varia.LevelRangeFilter
       log4j.appender.appenderName.filter.filterName.LevelMin=debug
       log4j.appender.appenderName.filter.filterName.LevelMax=debug

log4j.properties

### 设置###
#debug是日志级别,stdout,D,E是占位用的
log4j.rootLogger = debug,stdout,D,E

### 输出信息到控制抬 ###
#定义stdout输出的位置
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n

### 输出DEBUG 级别以上的日志到=E://logs/error.log ###
#定义D输出的位置
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = E://logs/log.log
log4j.appender.D.Append = true
log4j.appender.D.Threshold = DEBUG 
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n

### 输出ERROR 级别以上的日志到=E://logs/error.log ###
#定义E输出的位置
log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
log4j.appender.E.File =E://logs/error.log 
log4j.appender.E.Append = true
log4j.appender.E.Threshold = ERROR 
log4j.appender.E.layout = org.apache.log4j.PatternLayout
#[]没任何含义,是就输出[]
log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n

springboot的logback日志:

步骤一:在pom.xml中导入依赖

  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.4.5.RELEASE</version>
    <relativePath/>
  </parent>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
    <!-- mvc,aop的依赖包 -->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
      <!-- 由于我们在上面指定了parent,这里就不需要指定版本号 -->
    </dependency>

    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
    </dependency>
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>jstl</artifactId>
    </dependency>
    <!--tomcat-->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-tomcat</artifactId>
    </dependency>
    <dependency>
      <groupId>org.apache.tomcat.embed</groupId>
      <artifactId>tomcat-embed-jasper</artifactId>
    </dependency>

    <!--mybatis-->
    <dependency>
      <groupId>org.mybatis.spring.boot</groupId>
      <artifactId>mybatis-spring-boot-starter</artifactId>
      <version>1.3.2</version>
    </dependency>
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.41</version>
    </dependency>
    <!-- 阿里巴巴的Druid数据库连接池 -->
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>druid-spring-boot-starter</artifactId>
      <version>1.1.9</version>
    </dependency>
    <dependency>
      <groupId>com.github.pagehelper</groupId>
      <artifactId>pagehelper</artifactId>
      <version>4.0.0</version>
    </dependency>

    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
    </dependency>
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>jstl</artifactId>
    </dependency>
    <!--tomcat-->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-tomcat</artifactId>
    </dependency>
    <dependency>
      <groupId>org.apache.tomcat.embed</groupId>
      <artifactId>tomcat-embed-jasper</artifactId>
    </dependency>
    <!--quartz-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context-support</artifactId>
    </dependency>
    <dependency>
      <groupId>org.quartz-scheduler</groupId>
      <artifactId>quartz</artifactId>
      <version>2.2.3</version>
    </dependency>
    <!--springboot整合aop-->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-aop</artifactId>
    </dependency>
    <dependency>
      <groupId>org.apache.shiro</groupId>
      <artifactId>shiro-spring</artifactId>
      <version>1.2.3</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context-support</artifactId>
      <version>5.0.8.RELEASE</version>
    </dependency>

    <!-- mvc,aop的依赖包 -->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
      <!-- 由于我们在上面指定了parent,这里就不需要指定版本号 -->
    </dependency>

    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
    </dependency>
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>jstl</artifactId>
    </dependency>
    <!--tomcat-->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-tomcat</artifactId>
    </dependency>
    <dependency>
      <groupId>org.apache.tomcat.embed</groupId>
      <artifactId>tomcat-embed-jasper</artifactId>
    </dependency>

    <!--mybatis-->
    <dependency>
      <groupId>org.mybatis.spring.boot</groupId>
      <artifactId>mybatis-spring-boot-starter</artifactId>
      <version>1.3.2</version>
    </dependency>
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.41</version>
    </dependency>
    <!-- 阿里巴巴的Druid数据库连接池 -->
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>druid-spring-boot-starter</artifactId>
      <version>1.1.9</version>
    </dependency>
    <dependency>
      <groupId>com.github.pagehelper</groupId>
      <artifactId>pagehelper</artifactId>
      <version>4.0.0</version>
    </dependency>

    <!--quartz-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context-support</artifactId>
    </dependency>
    <dependency>
      <groupId>org.quartz-scheduler</groupId>
      <artifactId>quartz</artifactId>
      <version>2.2.3</version>
    </dependency>

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-data-jpa</artifactId>
      <version>1.5.2.RELEASE</version>
    </dependency>

    <!--springboot整合aop-->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-aop</artifactId>
    </dependency>

    <dependency>
      <groupId>org.apache.shiro</groupId>
      <artifactId>shiro-spring</artifactId>
      <version>1.2.3</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context-support</artifactId>
      <version>5.0.8.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>com.github.pagehelper</groupId>
      <artifactId>pagehelper</artifactId>
      <version>4.0.0</version>
    </dependency>

    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.mybatis.spring.boot/mybatis-spring-boot-starter -->
    <dependency>
      <groupId>org.mybatis.spring.boot</groupId>
      <artifactId>mybatis-spring-boot-starter</artifactId>
      <version>1.3.2</version>
    </dependency>
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.41</version>
    </dependency>
    <!-- mvc,aop的依赖包 -->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
      <!-- 由于我们在上面指定了parent,这里就不需要指定版本号 -->
    </dependency>

    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
    </dependency>
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>jstl</artifactId>
    </dependency>
    <!--tomcat-->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-tomcat</artifactId>
    </dependency>
    <dependency>
      <groupId>org.apache.tomcat.embed</groupId>
      <artifactId>tomcat-embed-jasper</artifactId>
    </dependency>
  </dependencies>

步骤二:先在resources下创建logback日志文件

该案例将该日志文件命名为:logback.xml

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <!--向控制台添加日志信息-->
    <appender name="logs" class="ch.qos.logback.core.ConsoleAppender">
        <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>
                [%d] - %m%n
            </pattern>
        </layout>
    </appender>
    <!--每天产生一个新的日志文件-->
    <appender name="log" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>Debug</level>
            <onMatch>DENY</onMatch>
            <onMismatch>ACCEPT</onMismatch>
        </filter>
        <encoder>
            <pattern>
                [%d] - %m%n
            </pattern>
        </encoder>
        <!--滚动策略-->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <fileNamePattern>d://log//Debug -%d.log</fileNamePattern><!--输出到d://log//Debug-->
        </rollingPolicy>
    </appender>

    <appender name="log1" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>info</level>
            <onMatch>DENY</onMatch>
            <onMismatch>ACCEPT</onMismatch>
        </filter>
        <encoder>
            <pattern>
                [%d] - %m%n
            </pattern>
        </encoder>
        <!--滚动策略-->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>d://log//INFO -%d.log</fileNamePattern>
        </rollingPolicy>
    </appender>

    <appender name="log2" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>warn</level>
            <onMatch>DENY</onMatch>
            <onMismatch>ACCEPT</onMismatch>
        </filter>
        <encoder>
            <pattern>
                [%d] - %m%n
            </pattern>
        </encoder>
        <!--滚动策略-->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>d://log//Warn-%d.log</fileNamePattern>
        </rollingPolicy>
    </appender>

    <root level="info">
        <appender-ref ref="logs"></appender-ref>
        <appender-ref ref="log"></appender-ref>
        <appender-ref ref="log1"></appender-ref>
        <appender-ref ref="log2"></appender-ref>
    </root>






</configuration>

步骤三:在util包下创建一个声明我们产生的日子文件的配置工具类

该案例将该类命名为:MyPointCut

package com.qf.util.pointcup;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;
import java.util.Enumeration;

@Aspect
@Component
public class MyPointCut {
    private Logger logger = LoggerFactory.getLogger(MyPointCut.class);

    //定义切入点
    @Pointcut("execution(* com.qf.*.*(..))")
    public void cut(){}

    //前置通知
    @Before("cut()")
    public void mybefore(JoinPoint joinPoint){
        ServletRequestAttributes requestAttributes = (ServletRequestAttributes)RequestContextHolder.currentRequestAttributes();
        HttpServletRequest request = requestAttributes.getRequest();
        logger.debug("url:{}",request.getRequestURL());
        logger.debug("method:{}",request.getMethod());
        logger.debug("address:{}",request.getRemoteAddr());
        Enumeration<String> parameterNames = request.getParameterNames();
        while (parameterNames.hasMoreElements()){
            String element = parameterNames.nextElement();
            logger.debug("参数:{}",element,request.getParameter(element));
        }
    }

    @AfterReturning(returning = "aaa",pointcut = "cut()")
    public void myafter(String aaa){
        logger.debug("return:{}",aaa);
    }
}


本案例文件所在位置结构图:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值