Springboot 日志处置惩罚(非常详细)

打印 上一主题 下一主题

主题 1787|帖子 1787|积分 5361

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
日志存入数据库(AOP

1.引入aop依靠

  
  1. <!-- aop依赖 -->
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter-aop</artifactId>
  5. </dependency>
复制代码
2.创建自界说注解类(用于在Controller层使用注解标注哪个方法需要增加日志)

  1. 在log包下创建Log.java文件
  2. @Target(ElementType.METHOD)
  3. @Retention(RetentionPolicy.RUNTIME)
  4. public @interface Log {
  5. String value() default "";
  6. }
  7. @interface 注解类,自定义注解
  8. @Target 用来说明该注解可以被声明在那些元素之前
  9. ElementType.METHOD说明该注解只能被声明在一个类的方法前
  10. @Retention 用来说明该注解类的生命周期。
  11. RetentionPolicy.RUNTIME注解保留在程序运行期间,此时可以通过反射获得定义在某个类上的所有注解
复制代码
3.编写LogAspect增强类与增强方法(我们使用环绕增强around)

  
  1. @Aspect
  2. @Component
  3. public class LogAspect {
  4. //切入点,指定当使用Log注解时进入环绕增强
  5. @Pointcut("@annotation(com.hz.log.Log)")
  6. public void pointcut() {}
  7. @Around("pointcut()")
  8. public Object around(ProceedingJoinPoint point) {
  9. try {
  10. System.out.println("执行环绕增强..............开始");
  11. Object result = point.proceed();//执行方法
  12. System.out.println("结束..........");
  13. return result;
  14. } catch (Throwable throwable) {
  15. throwable.printStackTrace();
  16. }
  17. return null;
  18. }
  19. }
复制代码
4.创建controller进行测试

  1. @Log("获取所有用户集合")
  2. @GetMapping("/getSfUserList")
  3. public List<SfUser> getSfUserList() {
  4. List<SfUser> sfUserList = sfUserService.getSfUserList(1);
  5. System.out.println(sfUserList.size());
  6. return sfUserList;
  7. }
复制代码
5.开始写入数据库

  1. DROP TABLE IF EXISTS `sys_log`;
  2. CREATE TABLE `sys_log` (
  3. `ID` bigint(20) NOT NULL AUTO_INCREMENT,
  4. `USERNAME` varchar(50) DEFAULT NULL COMMENT '用户名',
  5. `OPERATION` varchar(50) DEFAULT NULL COMMENT '用户操作',
  6. `TIME` int(11) DEFAULT NULL COMMENT '响应时间',
  7. `METHOD` varchar(200) DEFAULT NULL COMMENT '请求方法',
  8. `PARAMS` varchar(500) DEFAULT NULL COMMENT '请求参数',
  9. `IP` varchar(64) DEFAULT NULL COMMENT 'IP地址',
  10. `CREATE_TIME` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  11. PRIMARY KEY (`ID`)
  12. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
复制代码
6.创建实体类

  1. /**
  2. * 日志记录实体类
  3. */
  4. public class SysLog {
  5. private Long id;
  6. private String username;
  7. private String operation;
  8. private Integer time;
  9. private String method;
  10. private String params;
  11. private String ip;
  12. private Date createTime;
  13. .....get...set...
  14. }
复制代码
7.编写DAO层接口与实现,向表中插入数据

   
  1. @Repository
  2. public class SysLogDaoImpl implements SysLogDao {
  3. @Autowired
  4. @Qualifier("mysqlJdbcTemplateOne") //使用第一个数据源
  5. private JdbcTemplate jdbcTemplate;
  6. //保存信息到日志表
  7. @Override
  8. public void saveSysLog(SysLog syslog) {
  9. String sql = "insert into sys_log(USERNAME,OPERATION,TIME,METHOD,PARAMS,IP)";
  10. jdbcTemplate.update(sql,new Object[]
  11. {syslog.getUsername(),syslog.getOperation(),syslog.getTime(),syslog.getMethod(),
  12. syslog.getParams(),syslog.getIp()});
  13. }
  14. }
复制代码
  8.修改LogAspect增强类与增强方法

  
  1. @Aspect
  2. @Component
  3. public class LogAspect {
  4. @Autowired
  5. private SysLogDao sysLogDao;
  6. @Pointcut("@annotation(com.hz.log.Log)")
  7. public void pointcut() {}
  8. @Around("pointcut()")
  9. public Object around(ProceedingJoinPoint point) {
  10. try {
  11. long beginTime = System.currentTimeMillis();//开始执行时间
  12. Object result = point.proceed();//执行方法
  13. // 执行时长(毫秒)
  14. long time = System.currentTimeMillis() - beginTime;
  15. //实例化日志类
  16. SysLog sysLog = new SysLog();
  17. sysLog.setUsername("wzy");//模拟一个用户名 实际可以从session中获取
  18. sysLog.setTime((int) time);//执行时长(毫秒)
  19. // 获取request
  20. HttpServletRequest request =
  21. HttpContextUtils.getHttpServletRequest();
  22. // 设置IP地址
  23. sysLog.setIp(IPUtils.getIpAddr(request));
  24. MethodSignature signature = (MethodSignature) point.getSignature();
  25. Method method = signature.getMethod();
  26. Log logAnnotation = method.getAnnotation(Log.class);
  27. if (logAnnotation != null) {
  28. // 注解上的描述
  29. sysLog.setOperation(logAnnotation.value());
  30. }
  31. // 请求的方法名
  32. String className = point.getTarget().getClass().getName();
  33. String methodName = signature.getName();
  34. sysLog.setMethod(className + "." + methodName + "()");
  35. // 请求的方法参数值
  36. Object[] args = point.getArgs();
  37. // 请求的方法参数名称
  38. LocalVariableTableParameterNameDiscoverer u = new
  39. LocalVariableTableParameterNameDiscoverer();
  40. String[] paramNames = u.getParameterNames(method);
  41. if (args != null && paramNames != null) {
  42. String params = "";
  43. for (int i = 0; i < args.length; i++) {
  44. params += " " + paramNames[i] + ": " + args[i];
  45. }
  46. sysLog.setParams(params);
  47. }
  48. // 保存系统日志
  49. sysLogDao.saveSysLog(sysLog);
  50. return result;
  51. } catch (Throwable throwable) {
  52. throwable.printStackTrace();
  53. }
  54. return null;
  55. }
  56. }
  57. 注意:
  58. IP的获取需要工具类,网上可以自行查找
  59. 获取参数与获取方法名的方式都可以从网站查询
复制代码
  9.运行测试@Log

   日志控制台打印与写入文件(logback

   1.创建logback-spring.xml文件放入resource下,并复制内容到该文件

  
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <configuration>
  3. <property name="LOG_CONTEXT_NAME" value="log"/>
  4. <!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
  5. <property name="LOG_HOME" value="D:/logs" />
  6. <!-- 定义日志上下文的名称 -->
  7. <contextName>${LOG_CONTEXT_NAME}</contextName>
  8. <!-- 控制台输出 -->
  9. <!--<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
  10. <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
  11. &lt;!&ndash;格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个
  12. 字符宽度%msg:日志消息,%n是换行符&ndash;&gt;
  13. <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %highlight(%-5level)
  14. %cyan(%logger{50}:%L) - %msg%n</pattern>
  15. <charset>utf-8</charset>
  16. </encoder>
  17. <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
  18. <level>INFO</level>
  19. </filter>
  20. </appender>-->
  21. <!-- 彩色日志依赖的渲染类 -->
  22. <conversionRule conversionWord="clr"
  23. converterClass="org.springframework.boot.logging.logback.ColorConverter" />
  24. <conversionRule conversionWord="wex"
  25. converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProx
  26. yConverter" />
  27. <conversionRule conversionWord="wEx"
  28. converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrow
  29. ableProxyConverter" />
  30. <!-- 彩色日志格式 -->
  31. <property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-
  32. %clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p})
  33. %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint}
  34. %clr(%-40.40logger{39}){cyan} %clr(:){faint}
  35. %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
  36. <!--1. 输出到控制台-->
  37. <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
  38. <!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级
  39. 别的日志信息-->
  40. <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
  41. <level>INFO</level>
  42. </filter>
  43. <encoder>
  44. <Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
  45. <!-- 设置字符集 -->
  46. <charset>UTF-8</charset>
  47. </encoder>
  48. </appender>
  49. <!--info日志统一输出到这里-->
  50. <appender name="file.info"
  51. class="ch.qos.logback.core.rolling.RollingFileAppender">
  52. <Prudent>true</Prudent>
  53. <rollingPolicy
  54. class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
  55. <!--日志文件输出的文件名,按小时生成-->
  56. <FileNamePattern>${LOG_HOME}/%d{yyyy-MM-dd}/info/info.%d{yyyy-MM-ddHH}.%i.log</FileNamePattern>
  57. <!--日志文件保留天数-->
  58. <MaxHistory>30</MaxHistory>
  59. <timeBasedFileNamingAndTriggeringPolicy
  60. class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
  61. <!-- 除按日志记录之外,还配置了日志文件不能超过10M(默认),若超过10M,日志
  62. 文件会以索引0开始, -->
  63. <maxFileSize>10MB</maxFileSize>
  64. </timeBasedFileNamingAndTriggeringPolicy>
  65. </rollingPolicy>
  66. <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
  67. <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符
  68. 宽度 %method 方法名 %L 行数 %msg:日志消息,%n是换行符-->
  69. <pattern> %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level
  70. %logger{56}.%method:%L - %msg%n</pattern>
  71. <charset>utf-8</charset>
  72. </encoder>
  73. <!-- 此日志文件只记录info级别的 -->
  74. <filter class="ch.qos.logback.classic.filter.LevelFilter">
  75. <level>INFO</level>
  76. <onMatch>ACCEPT</onMatch>
  77. <onMismatch>DENY</onMismatch>
  78. </filter>
  79. </appender>
  80. <!--错误日志统一输出到这里-->
  81. <appender name="file.error"
  82. class="ch.qos.logback.core.rolling.RollingFileAppender">
  83. <Prudent>true</Prudent>
  84. <rollingPolicy
  85. class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
  86. <!--日志文件输出的文件名,按天生成-->
  87. <FileNamePattern>${LOG_HOME}/%d{yyyy-MM-dd}/error/error.%d{yyyy-MMdd}.%i.log</FileNamePattern>
  88. <!--日志文件保留天数-->
  89. <MaxHistory>30</MaxHistory>
  90. <timeBasedFileNamingAndTriggeringPolicy
  91. class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
  92. <!-- 除按日志记录之外,还配置了日志文件不能超过10M(默认),若超过10M,日志
  93. 文件会以索引0开始, -->
  94. <maxFileSize>10MB</maxFileSize>
  95. </timeBasedFileNamingAndTriggeringPolicy>
  96. </rollingPolicy>
  97. <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
  98. <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符
  99. 宽度 %method 方法名 %L 行数 %msg:日志消息,%n是换行符-->
  100. <pattern> %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level
  101. %logger{56}.%method:%L - %msg%n</pattern>
  102. <charset>utf-8</charset>
  103. </encoder>
  104. <!-- 此日志文件只记录error级别的 -->
  105. <filter class="ch.qos.logback.classic.filter.LevelFilter">
  106. <level>ERROR</level>
  107. <onMatch>ACCEPT</onMatch>
  108. <onMismatch>DENY</onMismatch>
  109. </filter>
  110. </appender>
  111. <!--warn日志统一输出到这里-->
  112. <appender name="file.warn"
  113. class="ch.qos.logback.core.rolling.RollingFileAppender">
  114. <Prudent>true</Prudent>
  115. <rollingPolicy
  116. class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
  117. <FileNamePattern>${LOG_HOME}/%d{yyyy-MM-dd}/warn/warn.%d{yyyy-MMdd}.%i.log</FileNamePattern>
  118. <!--日志文件保留天数-->
  119. <MaxHistory>30</MaxHistory>
  120. <timeBasedFileNamingAndTriggeringPolicy
  121. class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
  122. <!-- 除按日志记录之外,还配置了日志文件不能超过10M(默认),若超过10M,日志
  123. 文件会以索引0开始, -->
  124. <maxFileSize>10MB</maxFileSize>
  125. </timeBasedFileNamingAndTriggeringPolicy>
  126. </rollingPolicy>
  127. <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
  128. <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符
  129. 宽度 %method 方法名 %L 行数 %msg:日志消息,%n是换行符-->
  130. <pattern> %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level
  131. %logger{56}.%method:%L - %msg%n</pattern>
  132. <charset>utf-8</charset>
  133. </encoder>
  134. <!-- 此日志文件只记录warn级别的 -->
  135. <filter class="ch.qos.logback.classic.filter.LevelFilter">
  136. <level>WARN</level>
  137. <onMatch>ACCEPT</onMatch>
  138. <onMismatch>DENY</onMismatch>
  139. </filter>
  140. </appender>
  141. <!-- 日志输出级别 -->
  142. <root level="DEBUG">
  143. <appender-ref ref="STDOUT" />
  144. <appender-ref ref="file.error" />
  145. <appender-ref ref="file.info" />
  146. <appender-ref ref="file.warn" />
  147. </root>
  148. </configuration>
复制代码
  2.配置application.properties文件

  
  1. #读取配置文件
  2. logging.config=classpath:logback-spring.xml
复制代码
  3.编写controller测试

  
  1. Logger log = Logger.getLogger(SfUserController.class);
  2. log.info("要输出的内容");//输出信息
  3. 等级可分为OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL,如果配置OFF则不打出任何信息,如果配置
  4. 为INFO这样只显示INFO, WARN, ERROR的log信息,而DEBUG信息不会被显示
复制代码
  

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

惊雷无声

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表