2013-12-10 31 views
12

Come è possibile configurare la registrazione a livello di programmazione in un'applicazione di avvio a molla?Configurazione registrazione programmatica di avvio a molla

L'utilizzo di un file xml o di proprietà non è abbastanza flessibile per le mie esigenze.

Aggiornamento: voglio ottenere qualcosa di simile:

@Value("${logging.level.root}") 
private String loggingLevelRoot; 

@Value("${logging.level.myApp}") 
private String loggingLevelMyApp; 

@Value("${logging.file}") 
private boolean fileAppenderEnabled; 

.... 

setLevel(Logger.ROOT_LOGGER_NAME, Level.toLevel(loggingLevelRoot))); 
setLevel("com.myapp", Level.toLevel(loggingLevelMyApp))); 
setLevel("org.springframework", Level.WARN); 
setLevel("org.apache.coyote", Level.INFO); 
setLevel("org.apache.catalina", Level.INFO); 
setLevel("org.apache.catalina.startup.DigesterFactory", Level.ERROR); 
setLevel("org.apache.catalina.util.LifecycleMBeanBase", Level.ERROR); 

Logger logger = (Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME); 
logger.addAppender(createConsoleAppender()); 
if (fileAppenderEnabled) { 
    logger.addAppender(createFileAppender()); 
} 

Tutto quello che devo per ambiente è:

  • logging.level.root = [INFO, DEBUG, ..]
  • logging.level.myApp = [INFO, DEBUG, ..]
  • logging.file = [true | false]

Nessuna duplicazione di XML, Groovy e altri formati con cui non voglio davvero occuparmi.

Alla fine della giornata, si tratta davvero di ottenere la stessa flessibilità per il logging di Spring JavaConfig fatto per i bean. XML o altri formati di file sono semplicemente troppo statici, richiedono troppe duplicazioni e non sono integrati abbastanza bene con il resto della configurazione dell'applicazione.

Perché la registrazione deve essere configurata in modo diverso rispetto a qualsiasi altro bean o servizio? Non ha senso.

+0

Cosa non è abbastanza flessibile utilizzando xml? Se si utilizza Logback, è possibile utilizzare Groovy per configurare il logback. –

+1

@ M.Deinum No, non puoi; Spring Boot (in realtà, penso che Spring Autoconfig) calpesta le configurazioni di Groovy. – chrylis

+0

Ho anche bisogno di una configurazione diversa per ambiente, con diversi tipi di appender, ... Quindi no, XML non lo taglia. –

risposta

13

Non sono sicuro di voler disattivare la configurazione XML predefinita del sistema di registrazione, ma si desidera eseguire le chiamate di personalizzazione dopo il. Fortunatamente è abbastanza facile perché è fatto il prima possibile nella catena di inizializzazione per un SpringApplication. Il posto più facile dove mettere il tuo codice è probabilmente un SpringApplicationInitializer (deve implementare anche ApplicationContextInitializer in modo che possa essere aggiunto allo SpringApplication). Per esempio.

SpringApplication application = new SpringApplication(MySources.class); 
application.addInitializers(new LoggingInitializer()); 
application.run(args); 

Non sarà in grado di fare l'iniezione di dipendenza nella initializer se lo si fa in questo modo, ma si farà in modo che venga chiamato il più presto possibile nel ciclo di vita. Se il tuo inizializzatore implementa EnvironmentAware, ti verrà inoltrata anche un'istanza di Environment prima della chiamata a SpringApplicationInitializer.initialize() - utilizzando che puoi risolvere i pezzi dipendenti dall'ambiente nel tuo campione, ad es.

String loggingLevelRoot = environment.getProperty("logging.level.root"); 

volta che lo avete a lavorare, per evitare di dover fare la stessa cosa per tutte le applicazioni si può fare dichiarativa con l'aggiunta di un META-INF/spring.factories contenente la classe di inizializzazione:

org.springframework.context.ApplicationContextInitializer=\ 
my.pkg.for.LoggingInitializer 

Se avete veramente bisogno di dipendenza iniezione e risoluzione @Value Penso che dovrai accettare il fatto che lo ApplicationContext verrà completamente aggiornato prima di avere la possibilità di configurare qualsiasi cosa. Se questo è un compromesso accettabile, ti consiglio di aggiungere un LoggingInitializer al tuo contesto e di implementarlo CommandLineRunner.

+0

Anche un'implementazione personalizzata di 'LoggingSystem' può fare il lavoro, non è vero? Tuttavia, non verrà rilevato automaticamente, quindi è necessario aggiungere '-Dorg.springframework.boot.logging.LoggingSystem = ' (o impostare le proprietà di sistema). –

+0

@DaveSyer 'EnvironmentAware' non funzionerebbe in questo caso. Se hai bisogno di un'istanza di Ambiente allora è meglio prenderla dall'istanza del contesto dell'applicazione all'interno del metodo 'initialize()'. – ydrozhdzhal

+0

Ho trovato estremamente utile questa spiegazione delle strategie alternative. Ho dovuto fare riferimento a questa domanda per un esempio di come fare un po 'di ciò che è raccomandato qui: https://stackoverflow.com/questions/46636599/how-do-i-set-the-logging-properties-in- a-molla-java-configurazione? noredirect = 1 & lq = 1 – user1445967

Problemi correlati