2015-04-03 31 views
42

Tôi đang thực hiện đăng nhập vào một dự án khởi động mùa xuân với thư viện logback. Tôi muốn tải các tệp cấu hình ghi nhật ký khác nhau theo hồ sơ mùa xuân của tôi (thuộc tính 'spring.pofiles.active'). Tôi có 3 tệp: logback-dev.xml, logback-inte.xml và logback-prod.xml. Tôi đang sử dụng phiên bản khởi động mùa xuân 1.2.2.RELEASE.spring boot, logback và logging.config tài sản

Như bạn có thể đọc trong tài liệu khởi động mùa xuân (here). Nó nói:

Có thể kích hoạt nhiều hệ thống ghi nhật ký khác nhau bằng cách cung cấp tệp cấu hình thích hợp trong đường dẫn lớp hoặc tại vị trí được chỉ định bởi môi trường mùa xuân tài sản logging.config. (Tuy nhiên, lưu ý rằng kể từ khi đăng nhập được khởi tạo trước khi ApplicationContext được tạo, không thể kiểm soát việc ghi nhật ký từ @PropertySources trong các tệp Spring @Configuration. Thuộc tính hệ thống và các tệp cấu hình bên ngoài Spring Boot thông thường hoạt động tốt.)

Vì vậy, tôi đã cố gắng để thiết lập 'logging.config' bất động sản trong application.properties tập tin của tôi:

logging.config=classpath:/logback-${spring.profiles.active}.xml 

Nhưng khi tôi bắt đầu ứng dụng của tôi, tôi logback- {profile} .xml không được tải ...

Tôi nghĩ rằng ghi nhật ký là một vấn đề phổ biến mà tất cả dự án sử dụng khởi động mùa xuân đã gặp phải. Tôi muốn biết nếu tôi đi đúng hướng hay không vì tôi có các giải pháp khác cũng hoạt động nhưng tôi thấy chúng không thanh lịch (phân tích có điều kiện với Janino trong tệp logback.xml hoặc thuộc tính dòng lệnh).

+0

bạn có tìm thấy giải pháp thanh lịch cho thời điểm bạn có nhiều hồ sơ hoạt động cùng một lúc không? – Gevorg

+0

Kiểm tra chỉnh sửa của tôi vào ngày 3 tháng 3 năm 2016 –

Trả lời

54

Tôi tìm thấy giải pháp và tôi hiểu lý do tại sao mùa xuân không quan tâm đến thuộc tính 'logging.config' được xác định trong tệp application.properties.

Giải pháp và giải thích:

Khi khởi tạo khai thác gỗ, khởi động mùa xuân chỉ trông vào classpath hoặc môi trường biến (xem http://docs.spring.io/spring-boot/docs/0.5.0.M3/api/org/springframework/boot/context/initializer/LoggingApplicationContextInitializer.html).

Giải pháp tốt nhất mà tôi tìm thấy là đưa vào tệp logback.xml gốc sẽ bao gồm tệp cấu hình ghi nhật ký phù hợp theo hồ sơ mùa xuân của tôi.

logback.xml:

<configuration> 
    <include resource="logback-${spring.profiles.active}.xml"/> 
</configuration> 

logback- [hồ sơ] .xml (trong trường hợp này, logback-dev.xml):

<included> 

    <!-- put your appenders --> 
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> 
    <!-- encoders are assigned the type 
    ch.qos.logback.classic.encoder.PatternLayoutEncoder by default --> 
     <encoder> 
      <pattern>%d{ISO8601} %p %t %c{0}.%M - %m%n</pattern> 
      <charset>utf8</charset> 
     </encoder> 
    </appender> 

    <!-- put your loggers here --> 
    <logger name="org.springframework.web" additivity="false" level="INFO"> 
     <appender-ref ref="CONSOLE" /> 
    </logger> 

    <!-- put your root here --> 
    <root level="warn"> 
     <appender-ref ref="CONSOLE" /> 
    </root> 

</included> 

Lưu ý: 'spring.profiles.active' phải được đặt trong các đối số dòng lệnh khi khởi động ứng dụng. E.G đối với tài sản JVM: -Dspring.profiles.active=dev

Ref tài liệu:

Chỉnh sửa (nhiều hồ sơ đang hoạt động): Để t o tránh nhiều tệp, chúng tôi có thể sử dụng xử lý có điều kiện yêu cầu phụ thuộc Janino (setup here), xem conditional documentation. Với phương pháp này, chúng tôi cũng có thể kiểm tra nhiều hồ sơ hoạt động cùng một lúc. E.G (Tôi đã không kiểm tra giải pháp này, hãy đưa ra nhận xét nếu nó không hoạt động):

<configuration> 

    <if condition='"${spring.profiles.active}".contains("profile1")'> 
     <then> 
     <!-- do whatever you want for profile1 --> 
     </then> 
    </if> 

    <if condition='"${spring.profiles.active}".contains("profile2")'> 
     <then> 
     <!-- do whatever you want for profile2 --> 
     </then> 
    </if> 

    <!-- common config --> 

</configuration> 

Xem câu trả lời cho một ví dụ khác về xử lý có điều kiện.

+0

Cách tiếp cận này có vẻ tốt cho trường hợp sử dụng của bạn, tuy nhiên, chúng tôi có thể có nhiều hơn một cấu hình được xác định trong môi trường. tức là spring.profiles.active = profile1, profile2. mjj1409

+0

Đúng vậy. Trong trường hợp này tôi sẽ sử dụng thư viện janino. –

+0

bất kỳ cập nhật nào về giải pháp thanh lịch khi bạn có nhiều hồ sơ hoạt động cùng một lúc? – Gevorg

21

Một cách tiếp cận khác có thể xử lý nhiều cấu hình là tạo một tệp thuộc tính riêng cho từng môi trường.

application-prod.properties

logging.config=classpath:logback-prod.xml 

application-dev.properties

logging.config=classpath:logback-dev.xml 

application-local.properties

logging.config=classpath:logback-local.xml 

ĐƯỢC BIẾT

Nếu bạn không cẩn thận bạn có thể sẽ đăng ở đâu đó bất ngờ

-Dspring.profiles.active=local,dev //will use logback-dev.xml 
-Dspring.profiles.active=dev,local //will use logback-local.xml 
4

chế biến có điều kiện với logback sẽ là một giải pháp mà không nhiều file logback. Đây là a link và cấu hình đăng nhập mẫu có hồ sơ mùa xuân.

<configuration> 

    <property name="LOG_LEVEL" value="INFO"/> 

     <if condition='"product".equals("${spring.profiles.active}")'> 
      <then> 
       <property name="LOG_LEVEL" value="INFO"/> 
      </then> 
      <else> 
       <property name="LOG_LEVEL" value="ERROR"/> 
      </else> 
     </if> 

     . 
     . 
     appender, logger tags etc. 
     . 
     . 

     <root level="${LOG_LEVEL}"> 
      <appender-ref ref="STDOUT"/> 
     </root> 

</configuration> 

Ngoài ra, bạn có thể phải thêm video này vào pom.xml của bạn

<dependency> 
    <groupId>org.codehaus.janino</groupId> 
    <artifactId>janino</artifactId> 
    <version>3.0.6</version> 
</dependency> 
8

Thay vì thêm XMLs logback riêng cho từng hồ sơ hoặc có điều kiện IF, tôi xin đề nghị như sau (Nếu bạn có ít sự khác biệt trong XMLs') để dễ dàng có điều kiện chế biến:

<springProfile name="dev"> 
<logger name="org.sample" level="DEBUG" /> 
</springProfile> 
<springProfile name="prod"> 
<logger name="org.sample" level="TRACE" /> 
</springProfile> 
+0

Liên kết tới tài liệu: https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-logging. html # _profile_specific_configuration –

+0

chúng tôi vẫn phải chỉ định spring.profiles.active = mode phải không? –

3

Spring có hỗ trợ thẻ tiếp theo <springProperty/> bên trong tập tin XML Logback, thẻ này được mô tả here. Nó có nghĩa là bạn có thể dễ dàng thêm biến từ tệp thuộc tính Spring, ngay cả giá trị biến này giải quyết từ biến môi trường/hệ thống bởi Spring.

Các vấn đề liên quan