Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/312.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_Inheritance_Logback - Fatal编程技术网

Java 使Logback不*遵循类继承*

Java 使Logback不*遵循类继承*,java,inheritance,logback,Java,Inheritance,Logback,remote.error.SuperClass package remote.error; 公共类超类{ 公共超类(){ //无法更改getClass(),因为它属于第三方库 LoggerFactory.getLogger(getClass()).debug(“不应打印”); } } local.debug.SubClass package local.debug; 公共类子类{ 公共子类(){ super();//本例为显式 LoggerFactory.getLogger(getClass(

remote.error.SuperClass

package remote.error;
公共类超类{
公共超类(){
//无法更改getClass(),因为它属于第三方库
LoggerFactory.getLogger(getClass()).debug(“不应打印”);
}
}
local.debug.SubClass

package local.debug;
公共类子类{
公共子类(){
super();//本例为显式
LoggerFactory.getLogger(getClass()).debug(“应打印”);
}
}
logback.xml


使用上述回写配置,不应打印仍将打印(除了应打印

有没有办法将Logback配置为不遵循类继承


换句话说,只应打印应打印,因为超类具有级别ERROR

基类应将静态引用的类传递给logback,而不是虚拟函数getClass()的结果

所以
SuperClass.class
而不是
this.getClass()

如果,正如您所说,您不能更改基类,或者提出错误报告让某人更改它,那么您唯一的选择就是更改派生类。因此,将
子类
放入包
remote.error.local
,但让它从调用中提取自己的记录器,并使用您想要的任意字符串,例如

LoggerFactory.getLogger("local.debug")

请考虑以下情况之一:

  • 创建一个不执行任何操作的appender,并为超类记录器配置此appender
  • 创建阻止来自超类记录器的所有日志消息的筛选器
  • 将超类记录器的级别配置为“关闭”
  • 下面是选项3的一些代码:

    超类.java SubClass.java 主类 logback.xml
    
    %d{HH:mm:ss.SSS}[%thread]-5级别%logger{36}-%msg%n
    
    问题在于超类属于第三方库,即无法修改。。。
    package com.learn;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    public class SuperClass
    {
        private static final Logger logger =
            LoggerFactory.getLogger(SuperClass.class);
    
        public SuperClass()
        {
            logger.info("should not show");
        }
    }
    
    package com.learn;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    public class SubClass
    extends SuperClass
    {
        private static final Logger logger = LoggerFactory.getLogger(SubClass.class);
    
        public SubClass()
        {
            logger.info("should show");
        }
    
        public void hoot()
        {
            logger.info("hoot");
        }
    }
    
    package com.learn;
    
    public class Main
    {
        public static void main(final String[] arguments)
        {
            SubClass subClass = new SubClass();
    
            subClass.hoot();
        }
    }
    
    <configuration>
      <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
          <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
      </appender>
    
        <logger name="com.learn.SuperClass" level="OFF"/>
    
      <root level="debug">
        <appender-ref ref="STDOUT" />
      </root>
    </configuration>