【发布时间】:2016-01-26 14:35:35
【问题描述】:
我有一个跟踪多个学生的应用程序。在处理有关该学生的信息时,我希望他们的日志消息进入该日志文件。
logs/system.log
logs/abby.log
logs/brett.log
logs/catherine.log
系统可以动态添加更多学生,所以我无法在我的日志配置文件中指定每个学生。如何在运行时指定记录器应将信息写入 catherine.log ?
【问题讨论】:
我有一个跟踪多个学生的应用程序。在处理有关该学生的信息时,我希望他们的日志消息进入该日志文件。
logs/system.log
logs/abby.log
logs/brett.log
logs/catherine.log
系统可以动态添加更多学生,所以我无法在我的日志配置文件中指定每个学生。如何在运行时指定记录器应将信息写入 catherine.log ?
【问题讨论】:
您使用的是哪个日志框架?如果您使用的是 Log4j,以下是一个示例:
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.apache.log4j.SimpleLayout;
import org.apache.log4j.FileAppender;
public class MyTestClass {
/* Logger Instance should always be kept static final */
private static final Logger LOGGER = Logger.getLogger(MyTestClass.class);
public static void main(String args[]) {
/* Create Dynamic FileAppender */
SimpleLayout myLayout = new SimpleLayout();
FileAppender nwAppender = new FileAppender(myLayout,"file_nm",false);
LOGGER.addAppender(nwAppender);
LOGGER.setLevel((Level) Level.INFO);
/* Write Level : Debug */
LOGGER.debug("*** DEBUG ***");
/* Write Level : Info */
LOGGER.info("*** INFO ***");
/* Write Level : Error */
LOGGER.info("*** ERROR ***");
}
}
【讨论】:
如何在运行时指定记录器应将信息写入 catherine.log ?
没有用于启用此行为的 logging.properties 选项。您必须编写代码来创建记录器(强引用)并在该记录器上安装 FileHandler。
abby.log 的消息同时写入系统日志和 abby.log。
您应该创建一个记录器命名空间,以便系统文件处理程序安装在根记录器上,并且每个学生都是一个子记录器,setUseParentHandlers 设置为 false。
如果多个线程在处理abby,会打开abby-1、abby-2
那是因为您创建了多个具有相同文件名的 FileHandler。创建地图并记住您打开的内容。
【讨论】: