Inheritance 使用log4j从基类和扩展类进行日志记录?

Inheritance 使用log4j从基类和扩展类进行日志记录?,inheritance,logging,log4j,slf4j,Inheritance,Logging,Log4j,Slf4j,我将slf4j与log4j一起使用,我有以下情况: package x.y.z.base; public class FTPOperationsBase { private final Logger log = LoggerFactory.getLogger(FTPOperationsBase.class); protected FTPClient ftp; // some more fields public void connect() {

我将slf4j与log4j一起使用,我有以下情况:

package x.y.z.base;
public class FTPOperationsBase {

    private final Logger log = LoggerFactory.getLogger(FTPOperationsBase.class);
    protected FTPClient ftp;
    // some more fields

    public void connect() {
        ...
        // log all connect exceptions
    }
    public void disconnect() {
        ...
        // log all disconnect exceptions
    };
}
可以看出,包装是x.y.z.base。现在我有几个扩展这个基类的类(这些类目前在包x.y.z.classA、x.y.z.clasB等中)

我希望这些类中的每一个都有独立的日志文件,因为它们作为独立的模块。但我也希望以某种方式将日志从基类放到这些单独的日志中,这取决于使用的是哪个类,也就是说,如果只有一个子类在执行,我不希望在所有日志中都使用日志形式的基类。例如,如果我有扩展类:

public class FTPExtendedClass1 
extends FTPOperationsBase {
    public void doSomething() {...}
}
并进行以下代码顺序:

FTPExtendedClass1 obj1 = new FTPExtendedClass1();
obj1.connect();
obj1.doSomething();
obj1.disconnect();
我希望此案例的日志文件如下所示:

  • connect()中可能的信息/警告/错误
  • doSomething()可能的信息/警告/错误
  • 来自断开连接()的可能信息/警告/错误
所有扩展类都应该如此,其中doSomething()是特定于类的方法。有没有办法为这种行为组织包/配置log4j


谢谢。

您必须在log4j.xml中创建不同的Appender

每班一个

<logger name="yourBaseClassName" additivity="false">
    <level value="INFO" />
    <appender-ref ref="BasefileAppender" />
</logger>

<appender name="BasefileAppender" class="org.apache.log4j.FileAppender">
<param name="File" value="/path/yourfile.log"/>

    <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%d{dd MM yyyy HH:mm:ss,SSS} %m%n"/>
    </layout>
</appender>

<logger name="yourExtendedClassName" additivity="false">
    <level value="INFO" />
    <appender-ref ref="ExtendOnefileAppender" />
</logger>

<appender name="ExtendOnefileAppender" class="org.apache.log4j.FileAppender">
<param name="File" value="/path/ExtendOnefileAppender.log"/>

    <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%d{dd MM yyyy HH:mm:ss,SSS} %m%n"/>
    </layout>
</appender>
我认为它不能满足您的第二个需求(但我还希望以某种方式将日志从基类放到这些单独的日志中,具体取决于使用的是哪个类)

但这是一个开始…;-)这样,您就可以根据类的名称登录到不同的文件


希望它能有所帮助

正如您所说,这不是我一直在寻找的解决方案,我已经意识到这种配置。我想我只需要通过基类方法声明传播异常,或者传递记录器引用,两者都可以。无论如何,+1表示花时间回答问题;)
Logger mylogger = Logger.getLogger(MyClass.class.getName())