2017-02-03 5 views
1

Я пытаюсь создать новую конфигурацию журнала во время полета в моем приложении на основе файла log4j2.xml. Код будет объяснить это сам:Создание нового Rolling File на мухе LOG4j2 2.6

XML File

<?xml version="1.0" encoding="UTF-8"?> 
<Configuration monitorInterval="5"> 
    <Appenders> 
     <Console name="STDOUT" target="SYSTEM_OUT"> 
      <PatternLayout pattern="%-d{yyyy MMM dd HH:mm:ss,SSS} %5p %c{1} - %m%n" /> 
     </Console> 

     <RollingFile name="file" fileName="./log/application.log" 
      filePattern="./log/devfix-%-d{yyyy-MM-dd}.log"> 
      <PatternLayout pattern="%-d{yyyy-MM-dd HH:mm:ss.SSS} %5p %c{1} - %m%n" /> 
      <Policies> 
       <SizeBasedTriggeringPolicy size="100MB" /> 
      </Policies> 
      <DefaultRolloverStrategy max="10" /> 
     </RollingFile> 


     <Async name="ASYNC" bufferSize="2048"> 
      <AppenderRef ref="file" /> 
      <AppenderRef ref="STDOUT" /> 
     </Async> 

     <JMS name="jmsQueue" destinationBindingName="logQueue" 
      factoryName="org.apache.activemq.jndi.ActiveMQInitialContextFactory" 
      factoryBindingName="ConnectionFactory" providerURL="tcp://xxxx:xxxxx?jms.useAsyncSend=true"> 
      <PatternLayout pattern="%-d{yyyy-MM-dd HH:mm:ss.SSS} %5p %c{1} - %m%n" /> 
     </JMS> 

     <RollingFile name="fixfile" fileName="./log/fix.log" 
      filePattern="./log/fix-%-d{yyyy-MM-dd-HH}.log"> 
      <PatternLayout pattern="%-d{yyyy MMM dd HH:mm:ss,SSS} %c{1} - %m%n" /> 
      <Policies> 
       <SizeBasedTriggeringPolicy size="50MB" /> 
      </Policies> 
      <DefaultRolloverStrategy max="10" /> 
     </RollingFile> 

    </Appenders> 

    <Loggers> 
     <Logger name="jmsLogger" additivity="false" level="OFF"> 
      <AppenderRef ref="jmsQueue" /> 
     </Logger> 

     <Logger name="org.hibernate" level="WARN"> 
     </Logger> 
     <Logger name="FIX_CONFIG" level="INFO" additivity="false"> 
      <AppenderRef ref="fixfile" /> 
     </Logger> 
     <Root level="info"> 
      <AppenderRef ref="ASYNC" /> 
     </Root> 

    </Loggers> 
</Configuration> 

Так После этого в коде, я использую метод для создания нового rolligFileAppender.

private static Logger getLogger(String platformName) throws IOException { 

    /*Using a commun configuration to find the new Path for the plaform log file*/ 
    LoggerContext ctx = (LoggerContext) LogManager.getContext(false); 
    Configuration config = ctx.getConfiguration(); 
    RollingFileAppender fixAppender = (RollingFileAppender) config.getAppender("fixfile"); 
    if(null == fixAppender) { 
     Logger logger = LogManager.getLogger(platformName); 
     logger.error("Missing fixfile log4j appender in configuration"); 
     return logger; 
    } 
    String fileName = fixAppender.getFileName(); 
    if (null != fileName && fileName.toLowerCase().endsWith(".log")) 
     try { // remove empty fix.log file created by defaults 
      new File(fileName).delete(); 
     } catch (Exception e) { 
     } 

    /*construction of the new file name depending on the platform*/ 
    int slashIndex = null != fileName ? fileName.lastIndexOf("/") : -1; 
    fileName = slashIndex >= 0 ? fileName.substring(0, slashIndex + 1) + platformName.toLowerCase() + ".log" : platformName.toLowerCase() + ".log"; 

    /*construction of the new file Pattern depending on the platform*/ 
    String fileNamePattern = fixAppender.getFileName(); 
    int slashIndexPattern = null != fileNamePattern ? fileNamePattern.lastIndexOf("/") : -1; 
    fileNamePattern = slashIndex >= 0 ? fileNamePattern.substring(0, slashIndexPattern + 1) + platformName.toLowerCase()+"-%-d{yyyy-MM-dd-HH}.log" : platformName.toLowerCase() + "-%-d{yyyy-MM-dd-HH}.log"; 

    ConfigurationBuilder<BuiltConfiguration> builder = ConfigurationBuilderFactory.newConfigurationBuilder(); 
    builder.setStatusLevel(Level.INFO); 
    builder.setConfigurationName("RollingBuilder"); 


    // create a console appender 
    AppenderComponentBuilder appenderBuilder = builder.newAppender("Stdout", "CONSOLE").addAttribute("target", 
     ConsoleAppender.Target.SYSTEM_OUT); 
    appenderBuilder.add(builder.newLayout("PatternLayout") 
     .addAttribute("pattern", "%d [%t] %-5level: %msg%n%throwable")); 
    builder.add(appenderBuilder); 



    // create a rolling file appender 
    LayoutComponentBuilder layoutBuilder = builder.newLayout("PatternLayout") 
     .addAttribute("pattern", " %-d{yyyy-MM-dd HH:mm:ss.SSS} %5p %c{1} - %m%n"); 
    ComponentBuilder triggeringPolicy = builder.newComponent("Policies") 
     .addComponent(builder.newComponent("TimeBasedTriggeringPolicy")); 

     appenderBuilder = builder.newAppender("file2", "RollingFile") 
     .addAttribute("fileName", fileName) 
     .addAttribute("filePattern", fileNamePattern) 
     .add(layoutBuilder) 
     .addComponent(triggeringPolicy); 
    builder.add(appenderBuilder); 

    // create the new logger 
    builder.add(builder.newLogger(platformName.toLowerCase(), Level.INFO) 
     .add(builder.newAppenderRef("file2")) 
     .addAttribute("additivity", false)); 

    builder.add(builder.newRootLogger(Level.INFO) 
     .add(builder.newAppenderRef("file2"))); 


    LoggerContext newctx = Configurator.initialize(builder.build()); 
    return newctx.getLogger(platformName.toLowerCase()); 

} 

Проблема в том, что я не могу создать этот новый регистратор. Например, я называю это выделение параметром имени платформы = "test". файл ./log/test.log правильно создан, но я ничего не могу зарегистрировать.

Когда я пытался отлаживать последнее заявление LoggerContext newctx = Configurator.initialize (builder.build()), я заметил, что newctx указывает на мой файл log4j2.xml и поэтому инициализируется всеми его параметрами, и игнорируя мою инструкцию builer.Build().

У вас есть идея, почему это произойдет?

Заранее спасибо.

ответ