2013-12-10 11 views
12

Nasıl bir bahar çizme uygulamasında programlı giriş yapılandırabilirsiniz?Bahar Boot programlı günlüğü yapılandırma

Bir xml veya özellikler dosyası kullanmak, gereksinimlerim için yeterince esnek değil.

Güncelleme: Böyle bir şey başarmak istiyorum:

@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()); 
} 

Ben çevre başına gereken:

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

XML, Groovy ve diğer biçimlerin çoğaltılması ile uğraşmak istemiyorum. Günün sonunda

, bu bahar JavaConfig fasulye yaptığı gibi günlük için aynı esneklik kazanılması çok yakından ilgilidir. XML veya diğer dosya formatları çok statiktir, çok fazla çoğaltma gerektirir ve uygulamanın yapılandırmasının geri kalanıyla yeterince iyi entegre olmaz.

günlüğü başka fasulye veya hizmet daha farklı yapılandırılmalıdır Neden

? Hiçbir anlamı yok.

+0

Xml kullanarak yeterince esnek olmayan nedir? Logback'i kullanırsanız, yapılandırmayı yapılandırmak için Groovy'yi kullanabilirsiniz. –

+1

@ M.Deinum No, yapamazsınız; Spring Boot (aslında, Bence Spring Autoconfig) Groovy yapılandırmaları üzerinde durur. – chrylis

+0

Ayrıca, farklı eklenti türleri ile, ortam başına farklı bir yapılandırmaya ihtiyacım var ... Yani, XML onu kesmiyor. –

cevap

13

Günlüğe kaydetme sisteminin varsayılan XML yapılandırmasını devre dışı bırakmak istediğinizi ya da devre dışı bırakmanız gerektiğinden emin değilim, ancak yapılmış olan'dan sonra özelleştirme çağrılarınızı yürütmek istiyorsunuz. Neyse ki, SpringApplication için başlatıcı zincirinde olabildiğince erken yapıldığından bu oldukça kolaydır. Kodunuzu koymanın en kolay yolu muhtemelen SpringApplicationInitializer'dur (ApplicationContextInitializer'u uygulamak zorundadır, bu yüzden SpringApplication'a eklenebilir). Örneğin.

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

Sen bu şekilde yaparsak başlatıcısı içine bağımlılık enjeksiyon yapmak mümkün olmayacaktır, ama buna mümkün olduğunca erken yaşam döngüsü içinde çağrılan sağlayacaktır. Başlatıcınız EnvironmentAware'u uygularsa, SpringApplicationInitializer.initialize() numaralı çağrıdan önce Environment örneğini de geçirmiş olursunuz. Örneğin, örneğinizdeki ortam bağımlı parçalarını çözebilirsiniz.

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

bunu tüm uygulamalar için aynı şeyi yapmak zorunda kalmamak için size başlatıcı sınıfını içeren bir META-INF/spring.factories ekleyerek bildirim yapabilir, çalışmaya başladıktan sonra:

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

Eğer gerçekten bağımlılık gerekiyorsa Enjeksiyon ve @Value çözünürlük Ben bir şey yapılandırmak için bir şans almadan önce ApplicationContext tamamen yenilenmiş olacağını kabul etmek zorunda kalacağını düşünüyorum. Kabul edilebilir bir uzlaşma varsa, içeriğinize bir LoggingInitializer eklemenizi ve CommandLineRunner uygulamasını sağlamanızı öneririz.

+0

Özel bir 'LoggingSystem 'uygulaması işi de yapabilir, değil mi? Ancak, otomatik olarak algılanmayacaktır, bu nedenle '-Dorg.springframework.boot.logging.LoggingSystem = ' (veya sistem özelliklerini ayarlayın) eklemelisiniz. –

+0

@DaveSyer 'EnvironmentAware' bu durumda işe yaramaz. Ortam örneğine ihtiyacınız varsa, o zaman, 'initialize()' yöntemindeki uygulama bağlamı örneğinden almak daha iyidir. – ydrozhdzhal

+0

Alternatif stratejilerin bu açıklamasını son derece yararlı buldum. Burada önerilenlerin nasıl yapılacağına dair bir örnek için bu soruya başvurmam gerekiyordu: https://stackoverflow.com/questions/46636599/how-do-i-set-the-logging-properties-in- bir yay-java yapılandırma? noredirect = 1 ve lq = 1 – user1445967