Записать исключения во время выполнения в файл log4j2 - PullRequest
0 голосов
/ 11 апреля 2020

Я читал документацию по log4j2 и создал код для этой библиотеки, но не могу найти решение для регистрации исключений времени выполнения, таких как нулевые указатели, тайм-ауты или что-то подобное, в файле, я просто вижу эти исключения в консоли. Я читал об этом, и я вижу, что я могу достичь этого с помощью аспекта, но мой вопрос: есть способ записать эти исключения в файл через XML конфигурацию?

РЕДАКТИРОВАТЬ:

У меня есть файл конфигурации log4j2:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration monitorInterval="5">
    <Appenders>

        <Console name="console" target="SYSTEM_OUT">
            <PatternLayout>
                <Pattern>%r %d{yyyy-MM-dd HH:mm:ss:sss} %c %L %M %sn [%t] %-5p %m%n</Pattern>
            </PatternLayout>
        </Console>

        <File name="testingFile" fileName="testLog4j.log" append="true" ignoreExceptions="false" immediateFlush="true">

            <!--Layout type="PatternLayout">
                <Pattern>%r %d{yyyy-MM-dd HH:mm:ss:sss} %c %L %M %sn [%t] %-5p %msg%n</Pattern>
            </Layout-->
            <PatternLayout alwaysWriteExceptions="false">
                <Pattern>"%-5p [%t] %logger - %msg%ex%n</Pattern>
            </PatternLayout>

        </File>

    </Appenders>

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



        <!--Logger name="com.example" level="error" additivity="true">
            <AppenderRef ref="testingFile" />
        </Logger-->
    </Loggers>
</Configuration>

И у меня есть следующий класс:

public class Application {

    private static final Logger logger = LogManager.getLogger(Application.class.getName());

    public static void main(String args[]) throws Exception{

        while(true){
            //logger.debug("test");
            logger.trace("trace");
            logger.debug("debug");
            logger.info("test");
            logger.warn("test");
            logger.error("test");
            logger.fatal("test");
            logger.error("test");
            String s = null;
            s.substring(0);
        }
    }

Когда вы достигаете линии s.substring(0), вы получаете NullPointerException, это исключение регистрируется в консоли, а не в File Appender, и я хочу регистрировать такого рода исключения в моем файловом приложении.

Ответы [ 2 ]

0 голосов
/ 12 апреля 2020

Проверены все ваши XML конфигурации, и они кажутся нормальными. Единственное, что вам нужно для получения исключений времени выполнения, зарегистрированных в файле:

  private static final Logger logger = LogManager.getLogger(Log4j2Example.class);
  public static void main(String[] args) {
    try {
      String s = null;
      s.substring(0);
    } catch (Exception e) {
      logger.error("RunTime Exception: " + e, e);
    }
  }

toString Исключения наследуется от Throwable, где он печатает имя класса исключения и сообщение. Это добавляется к строке " RunTime Exception: " для формирования одной строки, которая печатается.

Таким образом, вам нужно передать исключение в logger.error в качестве аргумента.

logger.error("RunTime Exception: " + e, e);
0 голосов
/ 11 апреля 2020

Приложение файла Log4j2:

Вы определили Log4j2 Устройство файла ?

Таким образом, для входа в файл не потребуются какие-либо изменения в вашем файле. Java код. Может быть, вход в консоль может работать без него, но у меня в проекте root есть файл *1082*, который определяет, как Log4j2 должен регистрироваться.

Вот моя текущая версия с консолью appender и File appender определено:

    <?xml version="1.0" encoding="UTF-8"?>
    <Configuration status="WARN">
        <Appenders>
            <Console name="Console" target="SYSTEM_OUT">
                <PatternLayout pattern="%-5level %logger{36} - %msg%n"/>
            </Console>
            <File name="File" fileName="logs/app.log">
                <PatternLayout pattern="%-5level %logger{36} - %msg%n"/>
            </File>
        </Appenders>
        <Loggers>
            <Root level="TRACE">
                <AppenderRef ref="Console"/>
                <AppenderRef ref="File"/>
            </Root>
        </Loggers>
    </Configuration>

Могут быть и другие способы достижения того же результата. Загляните на страницу конфигурации Logj42 .

Если хотите, ознакомьтесь с другими типами доступных дополнений здесь . Если вас не устраивает способ отображения сообщений журнала, вы можете прочитать о Схемах шаблонов .


Исключения при регистрации:

Вы спрашивали об ошибках при регистрации и похоже, что он успешно может регистрировать общие записи в журнале.

Вам просто нужно обернуть ваш код в try-catch .

Например:

try {
    logger.info("Hello world");

    // I want to test my exception handling
    throw new RuntimeException("Triggering an error");
} catch (Exception e) {
    String errorMessage = "An error has occurred";
    logger.error(errorMessage, e);
    throw new RuntimeException(errorMessage, e);
}

Обратите внимание, что я ловлю Exception и выбрасываю RuntimeException . Exception является проверенным исключением - поэтому вызывающему коду необходимо его перехватить, а RuntimeException (подкласс Exception) - непроверенное исключение. Поэтому, выбрасывая RuntimeException, я намекаю на то, что произошло что-то совершенно неожиданное и что вызывающий код не будет знать, как с этим справиться - поэтому им не нужно catch это делать, и поскольку это не проверяется исключение, которое им не понадобится.

Таким образом, в предложении catch вы можете, в зависимости от ваших требований, сгенерировать Exception или RuntimeException, или ваше собственное пользовательское исключение, которое может быть либо проверенное исключение (подкласс Exception) или непроверенное исключение (подкласс RuntimeException).

Если вы не выбросите Exception из предложения catch, код будет продолжить выполнение после пункта catch, что, скорее всего, не то, что вам нужно.

Я вижу, что ваш код находится внутри метода public static void main(String args[]). Поэтому, возможно, вам не нужно выбрасывать Exception из предложения catch, поскольку выполнение программы в любом случае остановится после предложения catch, если предложение catch находится в конце метода. Возможно, Java напечатает что-то на консоли, если вы выбросите что-то из этого метода - но это не будет перехвачено и записано Log4j2.


Ведение журнала с аспектами:

Я вижу, вы можете войти, используя аспекты. См. Например здесь . Тем не менее, я просто попытаюсь заставить все работать с try-catch. Мне не приходилось использовать аспекты для ведения журнала, и мне кажется, что это немного работы для выгоды, которая не слишком ясна, поэтому я, к сожалению, не могу помочь с этим.

Надеюсь, что остальная часть моего ответа было полезно:)

...