変数に応じてlog4jのログを標準出力やファイルに出力したい。変数 writeLogToFile が設定されている場合、ログはファイルに書き込まれ、それ以外の場合は標準出力に書き込まれます。
次のコードを試してみましたが、ログはファイルと標準出力の両方に書き込まれます。
public class LTE {
private static Logger logger = Logger.getLogger(LTE.class);
public static void main(String[] args) {
/*some code which sets variables writeLogToFile and logFile*/
BasicConfigurator.configure();
if(writeLogToFile) {
FileAppender fappender = new FileAppender(new PatternLayout("%-6p [%t] (%F:%L) %m%n"), logFile);
logger.addAppender(fappender);
}
/*some code which uses info and debug methods to write log*/
}
}
これは、デフォルトでログが標準出力に書き込まれるため、ログを標準出力に書き込む場合に機能します。しかし、ログをファイルに書き込もうとすると、これは失敗します。ログは、標準出力とファイルの両方に書き込まれます。
そこで、次のコードを試してみましたが、これもうまくいきませんでした。
public class LTE {
private static Logger logger = Logger.getLogger(LTE.class);
public static void main(String[] args) {
/*some code which sets variables writeLogToFile and logFile*/
BasicConfigurator.configure();
if(writeLogToFile) {
FileAppender fappender = new FileAppender(new PatternLayout("%-6p [%t] (%F:%L) %m%n"), logFile);
logger.addAppender(fappender);
Properties logProperties = new Properties();
logProperties.setProperty("log4j.additivity.notRootLogger", "false");
PropertyConfigurator.configure(logProperties);
}
/*some code which uses info and debug methods to write log*/
}
}
私もフォローしてみました
public class LTE {
private static Logger logger = Logger.getLogger(LTE.class);
public static void main(String[] args) {
/*some code which sets variables writeLogToFile and logFile*/
BasicConfigurator.configure();
if(writeLogToFile) {
FileAppender fappender = new FileAppender(new PatternLayout("%-6p [%t] (%F:%L) %m%n"), logFile);
logger.addAppender(fappender);
}
else {
ConsoleAppender cappender = new ConsoleAppender(new PatternLayout("%-6p [%t] (%F:%L) %m%n"), "System.out");
logger.addAppender(cappender);
}
/*some code which uses info and debug methods to write log*/
}
}
誰かがこの問題を解決するのを手伝ってくれますか?
[編集]
わかった。私は問題を解決したと思います。logger.setAdditivity(false);
このようなコードに行を追加しました
public class LTE {
private static Logger logger = Logger.getLogger(LTE.class);
public static void main(String[] args) {
/*some code which sets variables writeLogToFile and logFile*/
BasicConfigurator.configure();
if(writeLogToFile) {
FileAppender fappender = new FileAppender(new PatternLayout("%-6p [%t] (%F:%L) %m%n"), logFile);
logger.addAppender(fappender);
logger.setAdditivity(false); //added line here
}
/*some code which uses info and debug methods to write log*/
}
}
現在、正常に動作しています。その場合writeLogToFile=true
、ログは標準出力に書き込まれ、それ以外の場合はファイルに書き込まれます。