spring遇到的问题汇总
有关日志的打印和日志如何使用
在实际项目中,我们的程序都是运行在linux上,有错误时也不能在本地的控制台上直观看到,所有合理打印日志对于程序员迅速定位到错误。
打印日志时的步骤
- application.yml配置文件中配置日志级别和日志文件的路径
logging:
level:
learning: debug
file: log/app-user.log
- 在controller中定义log对象
private static final Logger log = LoggerFactory.getLogger(VehicelController.class);
- 打印日志
在关键的节点使用info打印
log.info("程序开始")
log.info("程序结束")
在处理异常处使用error打印
try {
.....
.....
} catch (Exception e) {
e.printStackTrace();
log.error("异常{}", e);
;
}
日志中name和path的关系
logging.file.path 和 logging.file.name 两个同时存在的时候 logging.file.name的优先级更高,所以logging.file.path不会生效;
logging.file.path 默认的日志文件为指定路径下的spring.log,logging.file.name则可以自己指定路径和文件名;
有关静态值的注入
使用@Value
注解static类型的时候,会返回null值。需要注解在非静态方法、变量上。
文章链接:SpringBoot使用@Value给静态变量注入值 – CSDN
SpringBoot中使用@Value()只能给普通变量注入值,不能直接给静态变量赋值。
给普通变量赋值时,直接在变量声明之上添加@Value()注解即可
当要给静态变量注入值的时候,若是在静态变量声明之上直接添加@Value()注解是无效的
虽然没有编译和运行上的报错,经调试可知这种注解方式mailUsername、mailPassword、mailHost的值都是null,也就是说直接给静态变量读取配置文件是无效的
若要给静态变量赋值,可以使用set()方法,其中需要在类上加入@Component注解,方法名(例如setMailUsername)和参数名(例如username)可以任意命名
正确写法:
@Component
public class MyConfig { private static String env; public static String getEnv() {
return env;
} @Value("${env}")
public void setEnv(String env) {
MyConfig.env = env;
}
}
注意一定是在非静态方法setEnv前使用@Value
注解。也就是说要把set方法前面的static去掉。
这里是个坑。要注意
关于return写在finally块里的情况
链接:异常处理中在finally里面写return会怎么样 – CSDN
关于nohup运行程序
示例:
nohup java -Xms4096m -Xmx8192m -XX:PermSize=1024m -XX:MaxPermSize=2048m -XX:MaxNewSize=1024m -jar /opt/fileStore/jar/file-store-0.0.1-SNAPSHOT.jar >> /opt/fileStore/jar/logs/log.txt 2>&1 &
解释:
-
nohup表示后台运行,需要在末尾加&
-
中间的是jvm参数
-
>>/opt/fileStore/jar/logs/log.txt 表示标准输出日志到该位置
-
2>&1 标准错误输出到同样位置。如果不加会报一句话
nohup: ignoring input and redirecting stderr to stdout
,但是不影响使用。 -
jvm参数解释
-Xms1024m 配置初始堆内存1024m;
-Xmx1024m 配置最大堆内存1024m;
-XX:PermSize=256m Perm(俗称方法区)占整个堆内存的值;
-XX:MaxPermSize=512m 方法区占整个堆内存的最大值
-XX:MaxNewSize=512m 新生代内存上限值