¿Cuáles son las opciones disponibles para recuperar frijoles administrados por primavera en un appender log4j dentro de una aplicación web administrada por resorte?

StackOverflow https://stackoverflow.com/questions/1730634

Pregunta

Mi plomo de compilación actual tiene una gran idea en teoría: construya un apaudador Log4J personalizado que reciba frijoles administrados por resorte y los usa para registrar errores a otras fuentes que solo el archivo de registro estándar. Sin embargo, aparte de crear un singleton inicializado en el inicio con el contexto de la aplicación (código en un momento), parece que no puedo pensar en ninguna otra opción para recuperar un frijol administrado por Spring en un apéndice log4j.

public class SpringSingleton implements ApplicationContextAware {
    private static ApplicationContext context;
    public SpringSingleton() {
        super();
    }
    public static ApplicationContext getContext() {
        return SpringSingleton.context;
    }
    public void setApplicationContext(ApplicationContext context) {
        if(SpringSingleton.context != null) {
            throw new IllegalStateException("Context is already set!");
        }
        SpringSingleton.context = context;
    }
}

Idealmente, estas propiedades podrían establecerse al igual que los frijoles en la primavera a través de la inyección de dependencia: las referencias de Bean nunca cambiarán, sin importar cuántos apéndices se inicialicen. ¿Algunas ideas?

¿Fue útil?

Solución

Vas a tener un problema de Boostrap ya que Log4J tiene que ser inicializado antes de Primavera. Si estás usando un configuración personalizada o el inicializador estándar de Log4J, debe estar activo antes de que el contexto de la aplicación sea.

Ahora, en teoría podría hacer que sus apéndices personalizados se inicialicen "perezosamente" (ya sea a través del enfoque que sugirió anteriormente o haciendo que los apéndices mismos "semi" singletons, por ejemplo, la clase de appensores tiene un campo de instancia estática que se pobla por afterPropertiesSet() método; De esa manera, puede crear apéndice como bean en la primavera) pero parece algo desordenado e inconsistente.

Otro enfoque es reconfigurar dinámicamente log4j una vez que se inicializa el contexto de primavera; por ejemplo, escribir un oyente Para atrapar un ContextStartedEvent, obtenga todos los frijoles de tipo Appender Desde el contexto y agrégalos a la configuración LOG4J. Esto también le permitirá crear sus apéndices como frijoles, pero evite un poco de singleton.

Otros consejos

Un poco tarde, pero espero que esto pueda ayudar a alguien más. He documentado una solución a este problema en la respuesta que he proporcionado en el siguiente enlace:

LOG4J - Acceso a Spring Bean desde la clase Appender de registro

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top