如何使用Java代码配置Logback以设置日志级别?
除了将如何使用Java代码配置Logback以设置日志级别?,java,slf4j,logback,Java,Slf4j,Logback,除了将org.springframework.data.document.mongodb日志记录级别设置为DEBUG之外,我想使用默认的SLF4J+Logback配置 我如何用Java代码实现它 我没有使用XML,这个决定是在运行时做出的。下面的内容对我很有用,但通常这不是一个好主意。您的代码将依赖于Logback(您不能在SLF4J后面选择其他日志框架) 正如@palacsint所说,依赖于logback classic不是一个好主意。您可以使用Java的反射API实现您想要的。注意,由于使用
org.springframework.data.document.mongodb
日志记录级别设置为DEBUG
之外,我想使用默认的SLF4J+Logback配置
我如何用Java代码实现它
我没有使用XML,这个决定是在运行时做出的。下面的内容对我很有用,但通常这不是一个好主意。您的代码将依赖于Logback(您不能在SLF4J后面选择其他日志框架)
正如@palacsint所说,依赖于
logback classic
不是一个好主意。您可以使用Java的反射API实现您想要的。注意,由于使用反射,这种方法会给程序带来一些开销
用法:
LogbackUtils.setLogLevel(“com.stackoverflow.sample”,“DEBUG”)
代码:
public静态最终字符串LOGBACK\u CLASSIC=“ch.qos.LOGBACK.CLASSIC”;
公共静态最终字符串LOGBACK\u CLASSIC\u LOGGER=“ch.qos.LOGBACK.CLASSIC.LOGGER”;
公共静态最终字符串LOGBACK\u CLASSIC\u LEVEL=“ch.qos.LOGBACK.CLASSIC.LEVEL”;
私有静态最终记录器Logger=LoggerFactory.getLogger(LogbackUtils.class);
/**
*将给定类的logback日志级别动态设置为指定级别。
*
*@param loggerName用于设置其日志级别的记录器的名称。如果为空,将使用根记录器。
*@param logLevel支持的日志级别之一:跟踪、调试、信息、警告、错误、致命、,
*走开。{@code null}值被视为“关闭”。
*/
公共静态布尔setLogLevel(字符串loggerName,字符串logLevel)
{
字符串logLevelUpper=(logLevel==null)?“OFF”:logLevel.toUpperCase();
尝试
{
Package logbackpacage=Package.getPackage(LOGBACK_CLASSIC);
if(logbackpacage==null)
{
info(“Logback不在类路径中!”);
返回false;
}
//如果给定的记录器名称为空,则使用根记录器。
if((loggerName==null)| | loggerName.trim().isEmpty())
{
loggerName=(字符串)getFieldValue(LOGBACK_CLASSIC_LOGGER,“ROOT_LOGGER_NAME”);
}
//按名称获取记录器
Logger loggergovered=LoggerFactory.getLogger(loggerName);
if(loggergovered==null)
{
//我不知道这个案子是否发生过
warn(“没有名称为{},loggerName的记录器”);
返回false;
}
对象logLevelObj=getFieldValue(LOGBACK\u CLASSIC\u LEVEL,logLevelUpper);
if(logLevelObj==null)
{
warn(“没有这样的日志级别:{}”,logLevelUpper);
返回false;
}
类[]paramTypes={logLevelObj.getClass()};
对象[]参数={logLevelObj};
Class clz=Class.forName(LOGBACK\u CLASSIC\u LOGGER);
方法Method=clz.getMethod(“setLevel”,paramTypes);
调用(loggergovered,params);
debug(“对于记录器'{}',logLevelUpper,loggerName,日志级别设置为{}”);
返回true;
}
捕获(例外e)
{
warn(“无法将记录器{}’、logLevelUpper、loggerName、e的日志级别设置为{}”);
返回false;
}
}
//此处省略了bravity的getFieldValue()方法,
//但可在下面的GitHub链接中找到。
包括测试在内的完整代码:。我希望会有更好的答案:这也适用于单元/函数/集成测试,人们通常希望在测试期间抑制噪声。不得不使用配置文件有点麻烦。如果使用类名而不是包,上述方法将不起作用,因为获取的记录器是不同的实例。但是,在使用包时,它是可以的,因为日志记录级别会传播到子级。
final org.slf4j.Logger logger =
org.slf4j.LoggerFactory.getLogger("test.package");
if (!(logger instanceof ch.qos.logback.classic.Logger)) {
return;
}
ch.qos.logback.classic.Logger logbackLogger =
(ch.qos.logback.classic.Logger) logger;
logbackLogger.setLevel(ch.qos.logback.classic.Level.TRACE);
logger.trace("some log");