Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Java代码配置Logback以设置日志级别?_Java_Slf4j_Logback - Fatal编程技术网

如何使用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");