使用log4j从基类和扩展类登录?

时间:2011-08-09 11:57:56

标签: 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() {
        ...
        // log all connect exceptions
    }
    public void disconnect() {
        ...
        // log all disconnect exceptions
    };
}

可以看出,包是 x.y.z.base 。现在我有几个扩展这个基类的类(这些类目前在包x.y.z.cl​​assA,x.y.z.cl​​asB,...等)。

我希望每个类的单独日志文件,因为它们充当单独的模块。但我还想要以某种方式将日志从基类放到这些单独的日志中,具体取决于正在使用的类,即如果只执行一个子类,我不希望所有日志中都有日志格式基类< / strong>即可。例如,如果我有扩展类:

public class FTPExtendedClass1 
extends FTPOperationsBase {
    public void doSomething() {...}
}

并制作以下​​代码序列:

FTPExtendedClass1 obj1 = new FTPExtendedClass1();
obj1.connect();
obj1.doSomething();
obj1.disconnect();

我希望这个案例的日志文件如下:

  • 来自connect()
  • 的可能信息/警告/错误
  • 来自doSomething()的可能信息/警告/错误
  • 可能的信息/警告/错误来自disconnect()

对于所有扩展类都应如此,其中 doSomething()是特定于类的方法。有没有办法组织包/配置log4j这种行为?

感谢。

1 个答案:

答案 0 :(得分:2)

您必须在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>

然后在你的每个班级(基础和扩展)中你做:

Logger mylogger = Logger.getLogger(MyClass.class.getName())

我不认为它涵盖了你的第二个要求(但我还想要的是以某种方式将日志从基类放到这些单独的日志中,具体取决于使用的是哪个类)

但它的开始... ;-)有了这个你应该能够根据类的名称登录不同的文件。

希望有所帮助