2014-09-12 18 views
7

Tentativo di inserire proprietà definite nello application.properties/application.yml nello script logback.groovy in Spring Boot progetto.Come ottenere le proprietà dell'ambiente da application.properties in logback.groovy nel progetto Spring Boot?

Non riesco a inserire Environment o ApplicationContext in script groovy.

Esistono soluzioni alternative?

Sono non alla ricerca di soluzioni come System.getProperty('spring.profiles.active')

src/main/risorse/logback.groovy

import org.springframework.core.env.Environment 

@Inject private Environment env; //this is not working. how to get env here? 
println "spring.profiles.active : ${env.getProperty('spring.profiles.active')}" 

appender("STDOUT", ConsoleAppender) { 
    encoder(PatternLayoutEncoder) { 
     pattern = "%green(%d{HH:mm:ss.SSS}) [%thread] %highlight(%-5level) %cyan(%logger{36}) - %msg%n" 
    } 
} 

if(System.getProperty("spring.profiles.active")?.equalsIgnoreCase("prod")) { 
    root INFO, ["STDOUT", "FILE"] 
} else { 
    root INFO, ["STDOUT"] 
} 

src/main/risorse/application.yml

--- 
spring: 
    profiles: 
     active: development 
+0

solo una parola di avvertimento: 'spring.profile * s * .active' - più di uno è permesso (e separato da una virgola). potresti voler usare un'espressione regolare o almeno un controllo "contiene". – cfrick

+0

Buon punto. Mi assicurerò di gestire questo caso quando riesco a iniettare correttamente Environment in logback.groovy. – xmlking

+0

@xmlking hai mai risolto questo? Avere lo stesso problema ora. – code

risposta

2

logback.groovy n eeds da valutare molto presto perché altrimenti il ​​codice per caricare la configurazione della molla, l'istanziazione dei bean, ecc. non poteva registrare nulla. Ecco perché @Inject non può funzionare.

vedo 2 opzioni:

  1. si potrebbe facilmente caricare application.properties in logback.groovy, ma è tutt'altro che banale di prendere tutti i meccanismi di override di configurazione che la primavera fornisce in considerazione
  2. Crea un fagiolo molla che modifica la configurazione logback programmaticaly se inizializzato

un approccio diverso è esternare la configur logback azione in produzione con -Dlogback.configurationFile =/percorso/to/config.groovy. Mettendo il file di configurazione in una posizione ben nota (come /etc/my-app) è facile cambiare i livelli di registro in produzione senza ridistribuire (o addirittura riavviare).

0

Ci scusiamo per resuscitare questa discussione, ma mentre questo è il thread è quello che ho trovato mentre cercavo una soluzione, volevo condividere una soluzione alternativa.

ho usato un convertitore personalizzato e regola di conversione per estrarre immobili a risorsa percorso di classe (cioè application.properties):

In logback.groovy:

conversionRule('springApplicationName', CustomSpringApplicationNameConverter) 

def patternExpression = '%green([%d{YYYY-MM-dd HH:mm:ss.SSS}]) [%t] %highlight(%-5level) %magenta([%springApplicationName]) - %cyan(%logger{36}) -- %msg%n' 

e poi 'patternExpression' utilizzati in appender desiderato

e la mia classe convertitore personalizzato (in Groovy):

class CustomSpringApplicationNameConverter extends ClassicConverter { 

    @Override 
    String convert(ILoggingEvent event) { 
     ClassPathResource classPathResource = new ClassPathResource('application.properties') 

     Properties applicationProperties = new Properties() 
     applicationProperties.load(classPathResource.inputStream) 

     String springApplicationName = applicationProperties.getProperty('spring.application.name') 
     if (!springApplicationName) { 
      System.err.println('Could not find entry for \'spring.application.name\' in \'application.properties\'') 
     } 

     springApplicationName 
    } 
}