2016-05-22 15 views
2

ログレベル、ファイル名、ログファイルのファイルパスを設定します。私はこれを行う方法を見つけ、それはすべて動作しますが、log4jはログファイルを追加します。 私は、次のlog4j2.xmlだ:と$ {SYS:LOGFILENAME}::私は$ {LOGDIRのsys}を設定し、私の主な機能でLog4j2は不要なログファイルを作成します

<?xml version="1.0" encoding="UTF-8"?> 
<Configuration status="OFF"> 
    <Appenders> 
     <File name="logFile" filename="${sys:logDir}${sys:logFilename}" > 
      <PatternLayout pattern="%d{YYYY-MM-dd HH:mm:ss} [%t] %-5p %c{1}:%L - %msg%n" /> 
     </File> 
    </Appenders> 
    <Loggers> 
     <Root level="info"> 
      <AppenderRef ref="logFile" /> 
     </Root> 
    </Loggers> 
</Configuration> 

import config.ReadParameterFile; 
import org.apache.logging.log4j.Level; 
import org.apache.logging.log4j.LogManager; 
import org.apache.logging.log4j.Logger; 
import org.apache.logging.log4j.core.LoggerContext; 
import org.apache.logging.log4j.core.config.Configuration; 
import org.apache.logging.log4j.core.config.LoggerConfig; 

import java.io.IOException; 

public class main { 
private final static Logger log = LogManager.getLogger(main.class); 



    public static void main(String [] args) throws IOException { 
     ReadParameterFile config = new ReadParameterFile(); 

     LoggerContext ctx = (LoggerContext) LogManager.getContext(false); 
     Configuration config1 = ctx.getConfiguration(); 
     LoggerConfig loggerConfig = config1.getLoggerConfig(LogManager.ROOT_LOGGER_NAME); 


     switch (config.getProtokollProtokollTiefe()){ 
      case "Default":loggerConfig.setLevel(Level.DEBUG); 
       break; 
      case "Produktion":loggerConfig.setLevel(Level.ERROR); 
       break; 
      case "Test":loggerConfig.setLevel(Level.FATAL); 
       break; 
      default:System.out.print("falsche Logtief"); 


     } 


     System.setProperty("logDir",config.getProtokollDirProtokoll()); 
     System.setProperty("logFilename", config.getProtokollDateinameProtokoll()); 
     ctx.reconfigure(); 
     ctx.updateLoggers(); 



    } 

} 

それは私たいが、log4jのように働いています私のメインプロジェクトパスに "$ {sys:logDir} $ {sys:logFilename}"というファイルを作成してください。なぜlog4j2がこれをやっているのですか?私は名前を設定する前にログファイルを初期化すると思います。どうすれば変更できますか?

こんにちは!

私は、次の主要でPROBを解決することができます:

public class main { 


    public static void main(String [] args) throws IOException { 
     ReadParameterFile config = new ReadParameterFile(); 

     System.setProperty("logDir",config.getProtokollDirProtokoll()); 
     System.setProperty("logFilename", config.getProtokollDateinameProtokoll()); 
     switch (config.getProtokollProtokollTiefe()){ 
      case "Default":System.setProperty("logLvl","DEBUG"); 
       break; 
      case "Produktion":System.setProperty("logLvl","ERROR"); 
       break; 
      case "Test": System.setProperty("logLvl","ALL"); 
       break; 
      default:System.out.print("falsche Logtief"); 
     } 

    } 

} 
+0

は '民間最終静的ロガーログ= LogManager.getLogger(main.class)を削除するようにしてください;'? – Aris2World

+0

あなたは 'RollingFile'を使用しています。つまり、ファイルパターンで定義された特定の時点で新しいファイルが作成されるか、ファイルが' SizeBasedTriggeringPolicy'で定義されたサイズを超えています。 設定の詳細を参照してください:https://logging.apache.org/log4j/2.x/manual/appenders.html – Rafal

+0

@ Aris2Worldねえ、はい、私はすでにこれを試しました。まだ間違ったファイルがあります。 – ReasyEasyPeasy

答えて

2

private static ReadParameterFile config; 
private static Logger log; 
static { 
    config = new ReadParameterFile(); 
    System.setProperty("logDir",config.getProtokollDirProtokoll()); 
    System.setProperty("logFilename", config.getProtokollDateinameProtokoll()); 
    log = LogManager.getLogger(main.class); 
} 
2

ロガーは、静的フィールドとして宣言されています。これは、クラスがロードされるとの前に初期化され、の前にmainメソッドが呼び出されます。

LogManagerへの最初の呼び出しは、これらのシステムプロパティが設定された後になります。 プロパティを設定した後にロガーを初期化するか、コマンドラインで-Dオプションを使用してプロパティを設定することができます。あなたがする必要があるだろう

関連する問題