Log4j2 не регистрирует исключения лиц через appenders - PullRequest
0 голосов
/ 01 октября 2018

У меня есть сервер Tomcat с различными приложениями, и у каждого из них есть свой собственный app4 log2, который записывает в свой собственный файл, каждый класс Java правильно записывает свои исключения, а для исключений JSF, таких как незакрытые теги, неправильный класс / метод / свойствоимя Я сделал defaultexception handler, который регистрирует FacesExceptions, но по какой-то причине я не могу найти, что он вообще не регистрируется.

Вот спецификации среды Ubuntu 18.04 и 16.04 (пробовал на обоихв случае) tomcat 8.0.47 oracle jdk 1.8.0_181 myfaces 2.3.1 log4j2 2.11.0

Таким образом, дело в том, что даже при отладке handle () при принудительном исключении, оставляя открытые теги и т. д.,действительно достигает точек останова при вызове logger.error (), но он просто не добавляется к файлу.

Это объявление обработчика в файле face-config.xml проекта (я сэкономилвсе навигационные кейсы и прочее барахло, все это работает до сих пор, я отредактирую все это в случае необходимости)

    <faces-config version="2.0"
                      xmlns="http://java.sun.com/xml/ns/javaee" 
                      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
                      xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd">

        <factory>
            <exception-handler-factory>
                gescoweb.tools.DefaultExceptionHandlerFactory
            </exception-handler-factory>
        </factory>       

    </faces-config>

Это DefaultExceptionHandler.java

package gescoweb.tools;

import java.util.Iterator;
import javax.faces.FacesException;
import javax.faces.context.ExceptionHandler;
import javax.faces.context.ExceptionHandlerWrapper;
import javax.faces.context.FacesContext;
import javax.faces.event.ExceptionQueuedEvent;
import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;

/**
 *
 */
public class DefaultExceptionHandler extends ExceptionHandlerWrapper {

    private ExceptionHandler wrapped;

    public static final Logger LOGGER = LogManager.getLogger("gescoweb");

    public DefaultExceptionHandler(ExceptionHandler wrapped) {
        this.wrapped = wrapped;
    }

    @Override
    public ExceptionHandler getWrapped() {
        return this.wrapped;
    }

    /** Recibe la lista de excepciones y las procesa según su tipo.
     * @throws FacesException 
     */
    @Override
    public void handle() throws FacesException {
        for (Iterator<ExceptionQueuedEvent> i = getUnhandledExceptionQueuedEvents().iterator(); i.hasNext();) {
            Throwable t = i.next().getContext().getException();
            if (t != null) {
                LOGGER.error("Error inesperado.", new Exception(t));
            } else {
                LOGGER.error("", new Exception(t));
            }
        }
        getWrapped().handle();
    }

    /**
     * Tratamiento especial de otras excepciones.
     * @param facesContext
     * @param t
     * @return 
     */
    protected String handleUnexpected(FacesContext facesContext, final Throwable t) {
        if (t instanceof IllegalStateException) {
            return "key.exception.IllegalStateException";
        } else {
            super.handle();
            return "";
        }
    }
}

И это фабрика обработчиков

package gescoweb.tools;

import javax.faces.context.ExceptionHandler;
import javax.faces.context.ExceptionHandlerFactory;

/**
 *
 */
public class DefaultExceptionHandlerFactory extends ExceptionHandlerFactory {

    private ExceptionHandlerFactory parent;

    public DefaultExceptionHandlerFactory(ExceptionHandlerFactory parent) {
        this.parent = parent;
    }

    /**
     * Crea los handlers modificados.
     *
     * @return
     */
    @Override
    public ExceptionHandler getExceptionHandler() {
        ExceptionHandler eh = parent.getExceptionHandler();
        eh = new DefaultExceptionHandler(eh);
        return eh;

    }
}   

И, наконец, это файл конфигурации log4j2.xml

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
    <Properties>
        <Property name="log-path">${sys:catalina.base}/logs</Property>
        <Property name="layout"> [%-5level] %d{yyyy-MM-dd HH:mm:ss} %c{1} - %msg%ex%n </Property>
    </Properties>

    <Appenders>
        <!-- console appender -->
        <Console name="console-log" target="SYSTEM_OUT">
            <PatternLayout pattern="${layout}"/>
        </Console>

        <!-- logger gescoweb -->
        <RollingFile name="gescoweb-log" fileName="${log-path}/gescoweb.log"
                     filePattern="${log-path}/gescoweb/$${date:yyyy-MM}/gescoweb-%d{dd}.log.gz">
            <!-- log pattern -->
            <PatternLayout pattern="${layout}"/>
            <!-- set file size policy -->
            <CronTriggeringPolicy schedule="0 0 12 */7 * ?"/>
        </RollingFile>

        <!-- logger catalina -->
        <RollingFile name="catalina-log"
                     fileName="${log-path}/catalina.out"
                     filePattern="${log-path}/catalina/$${date:yyyy-MM}/catalina-%d{dd}.log.gz">
            <PatternLayout pattern="${layout}"/>
            <CronTriggeringPolicy schedule="0 0 12 */7 * ?"/>
        </RollingFile>

        <!-- logger localhost -->
        <RollingFile name="localhost-log"
                     fileName="${log-path}/localhost.log"
                     filePattern="${log-path}/localhost/$${date:yyyy-MM}/localhost-%d{dd}.log.gz">
            <PatternLayout pattern="${layout}"/>
            <CronTriggeringPolicy schedule="0 0 12 */7 * ?"/>
        </RollingFile>

        <!-- logger manager -->
        <RollingFile name="manager-log"
                     fileName="${log-path}/manager.log"
                     filePattern="${log-path}/manager/$${date:yyyy-MM}/manager-%d{dd}.log.gz">
            <PatternLayout pattern="${layout}"/>
            <CronTriggeringPolicy schedule="0 0 12 */7 * ?"/>
        </RollingFile>

        <!-- logger host-manager -->
        <RollingFile name="host-manager-log"
                     fileName="${log-path}/host-manager.log"
                     filePattern="${log-path}/host-manager/$${date:yyyy-MM}/host-manager-%d{dd}.log.gz">
            <PatternLayout pattern="${layout}"/>
            <CronTriggeringPolicy schedule="0 0 12 */7 * ?"/>
        </RollingFile>
    </Appenders>

    <Loggers>

        <Logger name="gescoweb" level="debug">
            <AppenderRef ref="gescoweb-log"/>
        </Logger>
        <Logger name="org.apache.catalina.core.ContainerBase.[Catalina].[localhost]"
                level="info"
                additivity="false">
            <AppenderRef ref="localhost-log"/>
        </Logger>
        <Logger name="org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/manager]"
                level="info"
                additivity="false">
            <AppenderRef ref="manager-log"/>
        </Logger>
        <Logger name="org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/host-manager]"
                level="info"
                additivity="false">
            <AppenderRef ref="host-manager-log"/>
        </Logger>
        <Root level="info">
            <AppenderRef ref="console-log"/>
            <AppenderRef ref="catalina-log"/>
        </Root>
    </Loggers>
</Configuration>

1 Ответ

0 голосов
/ 01 октября 2018

Не берите в голову, я импортировал неправильные библиотеки log4j в DefaultExceptionHandler, изменил импорт на

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

И теперь все работает ...

...