我正在使用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,...等)。
我希望每个类的单独日志文件,因为它们充当单独的模块。但我还想要以某种方式将日志从基类放到这些单独的日志中,具体取决于正在使用的类,即如果只执行一个子类,我不希望所有日志中都有日志格式基类< / strong>即可。例如,如果我有扩展类:
public class FTPExtendedClass1
extends FTPOperationsBase {
public void doSomething() {...}
}
并制作以下代码序列:
FTPExtendedClass1 obj1 = new FTPExtendedClass1();
obj1.connect();
obj1.doSomething();
obj1.disconnect();
我希望这个案例的日志文件如下:
对于所有扩展类都应如此,其中 doSomething()是特定于类的方法。有没有办法组织包/配置log4j这种行为?
感谢。
答案 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())
我不认为它涵盖了你的第二个要求(但我还想要的是以某种方式将日志从基类放到这些单独的日志中,具体取决于使用的是哪个类)
但它的开始... ;-)有了这个你应该能够根据类的名称登录不同的文件。
希望有所帮助