日志,程序员的小本本

日志的基本配置

导入依赖

  移除starter包中的原本的日志依赖,都是在父级pom.xml中配置。

     <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
            <!--排除springboot默认的日志依赖  后期自己整合-->
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-logging</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

  增加新的依赖

        <!--日志配置-->
        <!--引入日志依赖 抽象层 与 实现层-->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.21</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.7.21</version>
        </dependency>

日志properties配置

  

#创建 log4j.properties 并且放到资源文件目录 src/main/resources
log4j.rootLogger=DEBUG,stdout,file
log4j.additivity.org.apache=true
#第一个地方stdout  输出控制台
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
#标准的输出信息
log4j.appender.stdout.threshold=INFO   
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%-5p %c{1}:%L - %m%n
#以文件形式滚动输出
log4j.appender.file=org.apache.log4j.DailyRollingFileAppender
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.DatePattern='.'yyyy-MM-dd-HH-mm
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
log4j.appender.file.Threshold=INFO
log4j.appender.file.append=true
#日志的输出路径
log4j.appender.file.File=d:/log/wxshare/mylog.log

  日志的其他介绍

log4j日志输出格式一览:
%c 输出日志信息所属的类的全名
%d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy-MM-dd HH:mm:ss },输出类似:2002-10-18- 22:10:28
%f 输出日志信息所属的类的类名
%l 输出日志事件的发生位置,即输出日志信息的语句处于它所在的类的第几行
%m 输出代码中指定的信息,如log(message)中的message
%n 输出一个回车换行符,Windows平台为“rn”,Unix平台为“n”
%p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL。如果是调用debug()输出的,则为DEBUG,依此类推
%r 输出自应用启动到输出该日志信息所耗费的毫秒数
%t 输出产生该日志事件的线程名

#设置日志输出的等级为debug,低于debug就不会输出了
#设置日志输出到两种地方,分别叫做 stdout和 file  控制台输出和文件输出
log4j.rootLogger=DEBUG,stdout,file
log4j.additivity.org.apache=true
#第一个地方stdout, 输出到控制台
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.threshold=INFO
#设置输出格式%5p [%t] (%F:%L) - %m%n
#宽度是5的优先等级 线程名称 (文件名:行号) - 信息 回车换行
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%-5p %c{1}:%L - %m%n
#以文件形式滚动输出
log4j.appender.file=org.apache.log4j.DailyRollingFileAppender
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.DatePattern='.'yyyy-MM-dd-HH-mm
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
log4j.appender.file.Threshold=INFO
log4j.appender.file.append=true
log4j.appender.file.File=d:/log/wxshare/mylog.log

测试接口

  这个是controller类

//这句话放在任何一个需要打印日志的类中   controller 或者一些service的地方
final static Logger logger = LoggerFactory.getLogger(TestController.class); @GetMapping("logtest") public void logTest() { logger.debug("debug"); logger.info("info"); logger.warn("warn"); logger.error("error"); }

测试界面

 这里try it out一下,测试这个接口的目的还是为了在控制台中能看到对应的日志信息

Service日志管理-切面技术aspectJ

依赖导入

  老样子,还是在父级pom.xml中进行配置

        <!--配置springaop,日志监控-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>

配置

  properties里面可以加入一个sql的监控,可以输出sql查询时候的语句

#配置sql打印
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

需要切面的包结构

创建一个测试service层的接口TestService

package com.wt.service;

public interface TestService {
    public void logTest(int seconds);

    public void logSqlTest();
}

创建实现类TestServiceImpl

package com.wt.service.impl;

import com.wt.mapper.UserPoMapper;
import com.wt.pojo.UserPo;
import com.wt.service.TestService;
import org.apache.ibatis.logging.stdout.StdOutImpl;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;

@Service
public class TestServiceImpl implements TestService {

    @Resource
    private UserPoMapper userPoMapper;

    @Override
    public void logTest(int seconds) {
        try {
            Thread.sleep(1000*seconds);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void logSqlTest() {
      UserPo userPo = userPoMapper.selectByPrimaryKey(17);
        System.out.println(userPo);
    }
}

API模块

1、在api模块中进行aop切点的操作和测试接口的开发

 2、配置类aspect的开发

package com.wt.aspect;

import com.wt.controller.TestController;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

@Aspect    //spring的aop实现底层是aspectj框架管理
@Component
public class ServiceLogAspect {
    final static Logger log = LoggerFactory.getLogger(TestController.class);

    @Around("execution(* com.wt.service.impl..*.*(..))")
    public Object recordTimeLog(ProceedingJoinPoint joinPoint)throws Throwable {
        //使用日志输出  打印格式:某一个类(目标service),某一个方法(service执行方法)
        log.info("===开始执行{}.{}====="  //
                ,joinPoint.getTarget().getClass(), joinPoint.getSignature().getName() );
        //记录开始时间
        long begin = System.currentTimeMillis();
        //执行目标
        Object result = joinPoint.proceed();
        //记录结束时间
        long end = System.currentTimeMillis();
        long takeTime = end - begin;
        if(takeTime>3000) {
            log.error("=====执行结束,耗时间{}毫秒======",takeTime);
        }else if(takeTime>2000) {
            log.warn("======执行结束,耗时{}毫秒====", takeTime);
        }else {
            log.info("====执行结束, 耗时{}毫秒======",takeTime);
        }
        return result;
    }
}

3、测试接口controller的开发

   final static Logger logger = LoggerFactory.getLogger(TestController.class);

    @Resource
    private TestService testService;


    //这个是测试sql打印的
    @GetMapping("/logSqlTest")
    public void logSqlTest() {
        testService.logSqlTest();
    }

    /*这里是service切面日志测试*/
    @GetMapping("/logErrorTest")
    public void logErrorTest() {
        testService.logTest(3);
    }

测试

  这个访问了,会休眠3秒以后才会响应页面,我们这个测试主要是想查看超过三秒以后,打印出来的错误信息。

  这个就是控制台打印的信息,访问到service的方法,同时执行了切面的方法

   这个日志还有个超级舒服的方式可以去查看,就在本地文件。

 

  上面这个路径是我在日志文件中配置的,这个是api模块下的

原文地址:https://www.cnblogs.com/HelloM/p/14248782.html