2016-10-19 2 views
3

Прямо сейчас я пытаюсь использовать log4j2 войти все, что имеет уровень I NFO или выше (WARN, ошибка и FATAL) на мой сервер и все, что имеет уровень от INFO к моему пульт. Я могу регистрировать вещи на своей консоли, однако у меня возникла проблема с правильной регистрацией правильных уровней на сервере.Log4j2 не войдя в Graylog сервер правильно

Вот что я пытался до сих пор:

Java

import java.time.Instant; 

import org.apache.log4j.PropertyConfigurator; 
import org.apache.logging.log4j.LogManager; 
import org.apache.logging.log4j.Logger; 

public class App { 
    private static final Logger log4j = LogManager.getLogger(App.class.getName()); 

    public static void main(String[] args) { 
     try { 
      String log4jConfPath = "src/main/resources/log4j2.xml"; 
      PropertyConfigurator.configure(log4jConfPath); 
      log4j.info("this is a testmessage " + Instant.now().toString()); 
     } 
     catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 

XML

<?xml version="1.0" encoding="UTF-8"?> 
<Configuration status="trace" packages="org.graylog2.log4j2"> 

    <Properties> 
     <Property name="default_pattern">%d{MM/dd/yyyy hh:mm:ss} %5p %c{1} - %m%n 
     </Property> 
    </Properties> 

    <Appenders> 
     <Console name="console" target="SYSTEM_OUT"> 
      <PatternLayout pattern="${default_pattern}" /> 
     </Console> 
     <GELF name="gelfAppender" server="graylog.x.something.com" 
      hostName="some.host" port="12201"> 
      <PatternLayout pattern="%d{dd MMM yyyy HH:mm:ss,SSS} %5p %c{1} - %m%n" /> 
      <KeyValuePair key="extractStacktrace" value="true" /> 
      <KeyValuePair key="addExtendedInformation" value="true" /> 
      <KeyValuePair key="facility" value="gelf-java" /> 
      <KeyValuePair key="environment" value="TEST" /> 
      <KeyValuePair key="application" value="MyApp" /> 
      <KeyValuePair key="additionalFields" value="{'environment': 'TEST', 'application': 'MyAPP'}" /> 
     </GELF> 
    </Appenders> 

    <Loggers> 
     <Root level="error"> 
      <AppenderRef ref="gelfAppender" /> 
      <AppenderRef ref="console" /> 
     </Root> 
     <Root level="info"> 
      <AppenderRef ref="gelfAppender" /> 
      <AppenderRef ref="console" /> 

     </Root> 
    </Loggers> 
</Configuration> 

Приведенный выше код не выводит то, что я хочу, что иметь INFO вывода на консоль и INFO Уровни и выше вывод на сервер .

Вместо этого я могу выводить: ВСЕ (Trace) на консоль и INFO на сервер.

Я возился с XML файл немного, и я заметил, что когда я изменяю

status="trace" 

в

status="off" 

он записывает только INFO на консоль, но ничего к серверу ,

Наконец, и, вероятно, самая странная вещь всего, если я удалю

Instant.now().toString() 

от моего оператора печати, то ничего не будет зарегистрирован на сервере, независимо от статуса (если это TRACE или OFF) , но он все равно записывается на консоль. я думал, что это что-то делать с рисунком макет моего GELF Appender, поэтому я изменил

<PatternLayout pattern="%d{dd MMM yyyy HH:mm:ss,SSS} %5p %c{1} - %m%n" /> 

в

<PatternLayout pattern="${default_pattern}" /> 

, но это не меняет выход ...

Здесь мои текущие зависимости:

enter image description here

Короче говоря, я просто хочу регистрировать уровни INFO на моей консоли и уровни INFO или выше на моем сервере.

+0

[Этот вопрос] (http://stackoverflow.com/questions/26108045/how-to-log-only-one-level-with-log4j2) рассказывает вам, как настроить Log4j2 так, чтобы INFO и только INFO log сообщения идут на консоль. Кроме того, я не уверен, почему у вас есть два '' элементов в '': поскольку я понимаю, что их должно быть только одно, попробуйте удалить '' и посмотреть, поможет ли это. –

+0

Благодарим вас за ссылку. Я удалил лишний элемент ROOT и добавил пороговые фильтры, но все равно не повезло. –

ответ

3

Как вы, кажется, поняли, что вы должны использовать фильтр порога для фильтрации сообщений уровня WARN и из консоли appender.

Правильный способ определить различные уровни для различных appenders чтобы указать его на <Appender> элемент, как это:

<Loggers> 
    <Root level="trace"> 
     <Appender ref="console"/> 
     <Appender ref="file" level="info"/> 
    </Root> 
</Logger> 

Как решить проблему, вот простой пример программы и конфигурации, которая выводит INFO сообщения уровня на консоль, все сообщения журнала до все.log и INFO и до infoAndUp.log.

LogTest.java:

public class LogTest { 

    public static void main(String[] args) { 
     final Logger log = LogManager.getLogger(); 

     log.trace("This is a trace message"); 
     log.debug("This is a debug message"); 
     log.info("This is an info message"); 
     log.warn("This is a warning message"); 
     log.error("This is an error message"); 
     log.fatal("This is a fatal message"); 
    } 
} 

log4j2.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<Configuration status="WARN"> 
    <Appenders> 
     <Console name="console"> 
      <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> 
      <Filters> 
       <!-- Exclude messages logged above INFO --> 
       <ThresholdFilter level="WARN" onMatch="DENY" onMismatch="NEUTRAL"/> 
      </Filters> 
     </Console> 
     <File name="everything" fileName="everything.log"> 
      <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> 
     </File> 
     <File name="infoAndUp" fileName="infoAndUp.log"> 
      <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> 
     </File> 
    </Appenders> 
    <Loggers> 
     <Root level="trace"> 
      <AppenderRef ref="console" level="info"/> 
      <AppenderRef ref="everything" /> 
      <AppenderRef ref="infoAndUp" level="info"/> 
     </Root> 
    </Loggers> 
</Configuration> 

Результаты

выход консоли:

09:29:35.331 [main] INFO LogTest - This is an info message 

everything.log:

09:29:35.330 [main] TRACE LogTest - This is a trace message 
09:29:35.331 [main] DEBUG LogTest - This is a debug message 
09:29:35.331 [main] INFO LogTest - This is an info message 
09:29:35.332 [main] WARN LogTest - This is a warning message 
09:29:35.332 [main] ERROR LogTest - This is an error message 
09:29:35.332 [main] FATAL LogTest - This is a fatal message 

infoAndUp.log:

09:29:35.331 [main] INFO LogTest - This is an info message 
09:29:35.332 [main] WARN LogTest - This is a warning message 
09:29:35.332 [main] ERROR LogTest - This is an error message 
09:29:35.332 [main] FATAL LogTest - This is a fatal message 

Вы должны быть в состоянии установить свой собственный конфиг, используя это в качестве базы.

+0

Прохладный спасибо, он работает! Я знаю, что вы ответили на мой вопрос, но у меня есть последний вопрос: как получилось, когда я добавлю GELF-приложение к указанному выше коду, все работает нормально, но если я удалю два File appenders и их соответствующие регистраторы, ничто не приведет к регистрации в моем GELF-приложении ? –

+0

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

+0

Я согласен, это не имеет никакого смысла для меня, поскольку File appender и logger не должны иметь ничего общего ни с чем другим, кроме входа в этот файл. Я создал новый вопрос здесь: https://stackoverflow.com/questions/40315123/log4j2-does-not-log-to-server-after-removing-file-appender –

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

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