2016-05-22 2 views
2

Я хочу установить уровень журнала и имя файла и путь к файлу файла журнала. Я нашел способ сделать это, и все это работает, но log4j создает файл журнала добавления. я получил следующее log4j2.xml: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> 

В моей главной функции я поставил $ {SYS: LogDir} и $ {SYS: LogFilename}:

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

Попытка удалить 'частный окончательный статический журнал Logger = 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 должен появиться после установки этих свойств системы. Вы можете инициализировать Logger после установки свойств или установить свойства в командной строке с опцией -D.