1.创建一个日志配置文件用来更改日志的级别
import org.slf4j.LoggerFactory;
import org.slf4j.Logger;
import org.springframework.stereotype.Component;
@Component
public class LoggingConfig
/**
* 更改日志级别
* @param loggerName 日志输出类的路径
* @param level 级别 debug,warn,info,error,off
*/
public void setLoggingLevel(String loggerName,String level) {
Logger logger = LoggerFactory.getLogger(loggerName);
// 将日志级别转换为Logback的级别
ch.qos.logback.classic.Logger logbackLogger = (ch.qos.logback.classic.Logger) logger;
// 设置日志级别
logbackLogger.setLevel(ch.qos.logback.classic.Level.toLevel(level));
}
}
通过调用setLoggingLevel方法进行更改日志级别
如果有多个类需要同时设置相同的日志级别比如系统中有多个不同协议的服务,通服务下相关的类设置相同的日志级别进行日志的输出或者关闭。可以使用自定义注解进行动态统一设置。
1.创建自定义一个注解类
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface LogControl {
}
2.创建一个注解配置类
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import javax.annotation.PostConstruct;
import java.util.List;
/**
* 信号灯日志注解配置
* yxw
* @date 2024-10-11
*/
@Configuration
public class AnnotationConfig {
@Autowired
private List<Object> components;
private List<String> classNames = new ArrayList<>();
@PostConstruct
public void postConstruct() {
for (Object component : components) {
Class<?> clazz = component.getClass();
if (clazz.isAnnotationPresent(NettyServerLogControl.class)) {
classNames.add(clazz.getName());
}
}
}
}
3.在指定的类上添加注解
@Component
@LogControl
public class ServerControl {
public void init() {
log.info("Tcp服务数据解析");
}
}
4.调用方式
编写一个方法,循环注解自动注入的类名然后调用LoggingConfig 中的setLoggingLevel方法
for (String className : classNames) {
loggingConfig.setLoggingLevel(className,level);
}
注意:以上方法要灵活运用比如调用方式可以通过一个接口进行控制,如果有参数页面可以创建一个日志级别的参数,写一个completagbleFuture异步线程进行实时监控参数然后调用修改。