2016-09-20 6 views
0

Я хочу иметь разные регистраторы в моей программе. Каждый журнал записывает в другой файл. Имена файлов предопределены и не являются динамическими. Например, в пакете login будет использоваться регистратор, который записывает файл login.log. Все приложения будут одинаковыми, кроме имени файла. Вот файл конфигурации для программы, которая имеет два пакета «протоколирование» и «тест»:Log4j2 Имея одинаковые имена, но разные имена файлов для нескольких регистраторов

<?xml version="1.0" encoding="UTF-8"?> 
<Configuration status="warn" name="MyApp" packages=""> 
<Properties> 
    <Property name="log-location"> /home/roya/workspace/LogPractice/log</Property> 
</Properties> 
    <Appenders> 
    <RollingFile name="logging" fileName="${log-location}/logging.log" 
      filePattern="${log-location}/$${date:yyyy-MM}/logging-%d{yyyy-MM-dd-HH}-%i.log.gz"> 
     <PatternLayout pattern="%d %p %c{1.} [%t] %m%n" /> 
     <Policies> 
     <TimeBasedTriggeringPolicy /> 
     <SizeBasedTriggeringPolicy size="1 KB"/> 
     </Policies> 
     <DefaultRolloverStrategy max="5"> 
     <!-- 
     Nested conditions: the inner condition is only evaluated on files 
     for which the outer conditions are true. 
     --> 
     <Delete basePath="${log-location}" maxDepth="2"> 
      <IfFileName glob="*/app-*.log.gz"> 
      <IfLastModified age="30d"> 
       <IfAny> 
       <IfAccumulatedFileSize exceeds="100 GB" /> 
       <IfAccumulatedFileCount exceeds="10" /> 
       </IfAny> 
      </IfLastModified> 
      </IfFileName> 
     </Delete> 
     </DefaultRolloverStrategy> 
    </RollingFile> 


    <RollingFile name="test" fileName="${log-location}/test.log" 
      filePattern="${log-location}/$${date:yyyy-MM}/test-%d{yyyy-MM-dd-HH}-%i.log.gz"> 
     <PatternLayout pattern="%d %p %c{1.} [%t] %m%n" /> 
     <Policies> 
     <TimeBasedTriggeringPolicy /> 
     <SizeBasedTriggeringPolicy size="1 KB"/> 
     </Policies> 
     <DefaultRolloverStrategy max="5"> 
     <!-- 
     Nested conditions: the inner condition is only evaluated on files 
     for which the outer conditions are true. 
     --> 
     <Delete basePath="${log-location}" maxDepth="2"> 
      <IfFileName glob="*/app-*.log.gz"> 
      <IfLastModified age="30d"> 
       <IfAny> 
       <IfAccumulatedFileSize exceeds="100 GB" /> 
       <IfAccumulatedFileCount exceeds="10" /> 
       </IfAny> 
      </IfLastModified> 
      </IfFileName> 
     </Delete> 
     </DefaultRolloverStrategy> 
    </RollingFile> 
    <Console name="Console" target="SYSTEM_OUT"> 
     <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" /> 
    </Console> 
    </Appenders> 
    <Loggers> 
    <Logger name="logging"> 
    <AppenderRef ref="logging" level="ALL" /> 
    </Logger> 
    <Logger name="test"> 
    <AppenderRef ref="test" level="ALL" /> 
    </Logger> 
    <Root level="ALL"> 
     <AppenderRef ref="Console"/> 
    </Root> 
    </Loggers> 
</Configuration> 

Как вы можете увидеть appenders те же, за исключением файла. Есть ли способ определить только одно приложение и просто передать имя файла Logger?

ответ

0

Нет, они разные экземпляры Appender, даже если они настроены очень точно. Log4j 2 не обеспечивает механизм совместного использования частей конфигурации Appender.

Одна вещь, которую вы можете сделать, чтобы уменьшить дублирование, чтобы объявить действие Удалять только один раз (на одном из appenders, и сделать его сопрягать несколько файлов, чтобы он охватывает все appenders.

Вы также можете поднять запрос функции в журнале отслеживания log4j2 или в списке рассылки.

+0

Мне нужно создать более 50 приложений. Неужели нет способа? – user1871689

+0

Обновлено с предложением уменьшить дублирование. –

0

Я не уверен, если это может сработать, но стоит попробовать. Вы можете извлечь общий фрагмент приложения в отдельный файл и использовать XInclude. Кроме того, повторяющаяся часть файла шаблон может быть определен как свойство. Обе вещи значительно сократят строку конфигурации кодов.

Это будет выглядеть так.

log4j2.xml Файл:

<?xml version="1.0" encoding="UTF-8"?> 
<Configuration status="warn" name="MyApp" packages=""> 
<Properties> 
    <Property name="log-location"> /home/roya/workspace/LogPractice/log</Property> 
    <Property name="dir">${log-location}/$${date:yyyy-MM}</Property> 
    <Property name="ext">-%d{yyyy-MM-dd-HH}-%i.log.gz</Property> 
</Properties> 
<Appenders> 
    <RollingFile name="logging" fileName="${log-location}/logging.log" 
     filePattern="${dir}/logging${ext}"> 
     <xi:include href="log4j-xinclude-appender-config.xml" /> 
    </RollingFile> 

    <RollingFile name="test" fileName="${log-test}/test.log" 
     filePattern="${dir}/test${ext}"> 
     <xi:include href="log4j-xinclude-appender-config.xml" /> 
    </RollingFile> 

    <Console name="Console" target="SYSTEM_OUT"> 
     <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" /> 
    </Console> 

Файл log4j-XInclude-Appender-config.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<PatternLayout pattern="%d %p %c{1.} [%t] %m%n" /> 
    <Policies> 
    <TimeBasedTriggeringPolicy /> 
    <SizeBasedTriggeringPolicy size="1 KB"/> 
    </Policies> 
    <DefaultRolloverStrategy max="5"> 
    <!-- 
    Nested conditions: the inner condition is only evaluated on files 
    for which the outer conditions are true. 
    --> 
    <Delete basePath="${log-location}" maxDepth="2"> 
     <IfFileName glob="*/app-*.log.gz"> 
     <IfLastModified age="30d"> 
      <IfAny> 
      <IfAccumulatedFileSize exceeds="100 GB" /> 
      <IfAccumulatedFileCount exceeds="10" /> 
      </IfAny> 
     </IfLastModified> 
     </IfFileName> 
    </Delete> 
    </DefaultRolloverStrategy> 

 Смежные вопросы

  • Нет связанных вопросов^_^