问题描述
由于前端时间看了lombok的耦合性太高,不利于团队代码维护,一向注重代码质量的我,决定逐渐放弃掉lombok! 由于之前太依赖lombok了,导致有许多基本的知识都忘记了。
日志相关
用了lombok的日志,在类上面直接注解@slf4j即可,全局共享变量log拿来即用。非常的便捷,自动导入了相关的包,不需要过多费心在这上面。连logback都有默认的可以使用。即使没有添加logback文件,也是可以运行使用log的。 不用lombok的话,想要实现以前的内容,就需要做一些操作了。
第一步,引入相关依赖
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.2.3</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.30</version>
</dependency>
第二步,拿出珍藏多年的logback
<?xml version="1.0" encoding="UTF-8"?>
<!-- 官方推荐;以logback记录日志;log4j作者所出,替换log4j用 -->
<configuration scan="false">
<!--<include resource="org/springframework/boot/logging/logback/base.xml" />-->
<!-- 路径不能使用相对路径,注意windows和linux上不一样 -->
<!-- <property name="LOG_FILE_PATH" value="D:/userlog"/> -->
<property name="LOG_FILE_PATH" value="/userlog/geek45/commons"/>
<!-- ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑注意此处的路径需要修改哦↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ -->
<!-- 日志级别 -->
<!--开发环境-->
<root level="info">
<appender-ref ref="${APPENFER_NAME_CONSOLE_DEV}"/>
<!--<appender-ref ref="ASYNC" />-->
</root>
<!--正式环境-->
<!--<root level="info">-->
<!--<appender-ref ref="ASYNC" />-->
<!--</root>-->
<property resource="application.properties" />
<!-- 属性配置 -->
<property name="ROOT_LOG_LEVEL" value="INFO"/>
<property name="APPENDER_NAME_FILE" value="FILE"/>
<property name="APPENDER_NAME_ERROR" value="ERROR"/>
<property name="APPENFER_NAME_CONSOLE" value="CONSOLE"/>
<property name="APPENFER_NAME_CONSOLE_DEV" value="STDOUT"/>
<!-- 彩色日志 -->
<conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
<conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" />
<conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" />
<!-- 格式化输出:%d表示日期,%thread表示线程名,%-5level:级别 从左显示5个字符宽度 %msg:日志消息,%n是换行符 -->
<property name="FILE_LOG_PATTERN" value="%d{yyyy-MM-dd HH🇲🇲ss.SSSS} - %msg %n"/>
<property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH🇲🇲ss.SSS}}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %L %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
<!-- 禁用logback自身日志输出 -->
<statusListener class="ch.qos.logback.core.status.NopStatusListener" />
<!-- 输出到控制台的日志的格式以及使用的字符集 -->
<appender name="${APPENFER_NAME_CONSOLE}" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
<charset>UTF-8</charset>
</encoder>
<file>${LOG_FILE_PATH}/console.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 日志文件输出的文件名的格式以及归档的分隔方式 -->
<FileNamePattern>${LOG_FILE_PATH}/back-console/%d{yyyy.MM.dd.HH}.%i.log.zip</FileNamePattern>
<!-- 日志文件保留的最大天数,只能是整数 -->
<MaxHistory>168</MaxHistory>
<!-- 单个日志的最大容量 ,超出的话会压缩并重新创建日志文件 -->
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>20MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
</appender>
<!-- 输出到控制台的日志的格式以及使用的字符集 -->
<appender name="${APPENFER_NAME_CONSOLE_DEV}" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- 日志文件分隔保存的策略:基于大小和日期的方式分隔;日志的格式以及使用的字符集 -->
<appender name="${APPENDER_NAME_FILE}" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<pattern>${FILE_LOG_PATTERN}</pattern>
<charset>UTF-8</charset>
</encoder>
<file>${LOG_FILE_PATH}/info.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 日志文件输出的文件名的格式以及归档的分隔方式 -->
<FileNamePattern>${LOG_FILE_PATH}/back-info/%d{yyyy.MM.dd.HH}.%i.log.zip</FileNamePattern>
<!-- 日志文件保留的最大天数,只能是整数 -->
<MaxHistory>168</MaxHistory>
<!-- 单个日志的最大容量 ,超出的话会压缩并重新创建日志文件 -->
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>20MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
</appender>
<!-- 错误日志文件 -->
<appender name="${APPENDER_NAME_ERROR}" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<pattern>${FILE_LOG_PATTERN}</pattern>
<charset>UTF-8</charset>
</encoder>
<file>${LOG_FILE_PATH}/error.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 日志文件输出的文件名的格式以及归档的分隔方式 -->
<FileNamePattern>${LOG_FILE_PATH}/back-error/%d{yyyy.MM.dd.HH}.%i.log.zip</FileNamePattern>
<!-- 日志文件保留的最大天数,只能是整数 -->
<MaxHistory>168</MaxHistory>
<!-- 单个日志的最大容量 ,超出的话会压缩并重新创建日志文件 -->
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>20MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 异步写日志 -->
<appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender">
<discardingThreshold>0</discardingThreshold>
<queueSize>1024</queueSize>
<appender-ref ref ="${APPENDER_NAME_FILE}"/>
<appender-ref ref ="${APPENDER_NAME_ERROR}}"/>
<appender-ref ref="${APPENFER_NAME_CONSOLE}"/>
</appender>
<!-- 不同环境的日志级别配置 精确到包 -->
<!--<springProfile name="local">-->
<!--<logger name="io.geekidea.springbootplus" level="DEBUG"/>-->
<!--</springProfile>-->
<!--<!– show parameters for hibernate sql 专为 Hibernate 定制 –>-->
<!--<logger name="org.hibernate.type.descriptor.sql.BasicBinder" level="TRACE" />-->
<!--<logger name="org.hibernate.type.descriptor.sql.BasicExtractor" level="DEBUG" />-->
<!--<logger name="org.hibernate.SQL" level="DEBUG" />-->
<!--<logger name="org.hibernate.engine.QueryParameters" level="DEBUG" />-->
<!--<logger name="org.hibernate.engine.query.HQLQueryPlan" level="DEBUG" />-->
<!--<!–myibatis log configure–>-->
<!--<logger name="com.apache.ibatis" level="TRACE"/>-->
<!--<logger name="java.sql.Connection" level="DEBUG"/>-->
<!--<logger name="java.sql.Statement" level="DEBUG"/>-->
<!--<logger name="java.sql.PreparedStatement" level="DEBUG"/>-->
<!--<logger name="com.*.mapper" level="DEBUG"/>-->
</configuration>
到此为止,因为日志的问题导致项目起不来,基本就告一段落算是完成了。为了避免以后遇到这种问题再苦恼一番,特此记录一下,加深一下印象。
单元测试问题
这个问题就很尴尬了,特别简单的一个问题,因为本人的愚钝,导致单元测试起不来,还苦恼了一番,静下心来,仔细看一下错误,解决方案就直接出来了好吧!!
问题描述
单元测试运行的时候,出现这种错误:
Error running 'Rerun Failed Tests': Failed to resolve org.junit.platform:junit-platform-launcher:1.6.2
问题点
问题就出在引用的maven包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
问题解决
将maven依赖改成下面这样,问题就迎刃而解了。上面说的很清楚,找不到相关的包,没引入嘛!!引入不就OK了!!
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-launcher</artifactId>
<scope>test</scope>
</dependency>
单元测试无法自动装载一些bean的问题
@RunWith(SpringRunner.class)
@SpringBootTest(classes = SupplyApiBootstrap.class)
//使用上面的注解,指定启动类即可完成项目中一些相对特殊一些的bean对象的装载
总结
上述问题很白痴哈,解决前就觉得闹鬼了,哪哪都不好!
解决后,这问题真***白痴啊,哈哈,太简单了。
遇到问题,不慌,沉着冷静,仔细读一下错误,实在拗不过来,就百度一下撒。不要坐那哭喊好奇怪,没用的,自己动手丰衣足食。技术人员,不要祈求上帝帮你改bug了就。
问题很简单,记录一下,不要嫌弃自己丢人,知识在于点滴的积累,大牛在于不懈的解决问题。不管问题大小,积少成多。多牛逼不是看你写过多少代码,那是码农。多牛逼是看你改好了多少bug,解决了多少问题。失败乃成功之母,及时你只写过一个项目,遇到了100个问题,解决了50个,都比写了100个项目,成功80个,没有遇到过问题的人牛逼。解决问题的过程,就是你成长的过程。
你始终很帅,加油,越来越帅。