2013-01-11 25 views
5

Tôi có bảng điều khiển quản trị tôi đang xây dựng và tôi muốn hiển thị nhật ký được tạo trong Logback cho đơn đăng ký của mình. Tuy nhiên, nơi các bản ghi được lưu trữ là khác nhau cho mỗi môi trường. Tôi có một vài file tài sản đó xác định nơi các bản ghi được lưu trữ:Thuộc tính truy cập được xác định trong Đăng nhập theo chương trình

<configuration> 
    <property resource='log.properties'/> 
    <property resource='log.${ENV:-prod}.properties'/> 

    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> 
    <file>${log.dir}/sync.log</file> 
    ... 
</configuration> 

Tôi muốn tìm giá trị của ${log.dir} từ Logback's Java API. Tôi đã thử những điều sau đây, nhưng nó không có bất kỳ thuộc tính nào được định nghĩa trong tài nguyên. Ví dụ:

LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory(); 
String logDir = loggerContext.getProperty("log.dir"); // this always returns null 

Vì vậy, câu hỏi của tôi là tôi nên sử dụng API nào?

Trả lời

7

Theo mặc định, các thuộc tính được xác định trong "địa phương" scope. Tuy nhiên, bạn có thể buộc một thuộc tính có phạm vi ngữ cảnh, trong trường hợp đó là khá dễ dàng để có được giá trị của thuộc tính:

LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory(); 
String val = lc.getProperty(aString); 

Xác định các thuộc tính trong phạm vi "ngữ cảnh" được coi là hơi nặng. Thay vì xác định tất cả/nhiều thuộc tính trong phạm vi ngữ cảnh, bạn có thể xác định chỉ một thuộc tính duy nhất trong phạm vi ngữ cảnh. Dưới đây là một ví dụ:

<configuration> 
    <!-- get many props from a file --> 
    <property resource='log.properties'/> 
    <-- set only one to be in context scope --> 
    <property scope="context" name="log.dir.ctx" value="${log.dir}" /> 
    ... 
</configuration> 

Sau đó, bạn có thể có được những giá trị mà bạn đang tìm kiếm với:

LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory(); 
String val = lc.getProperty("log.dir.ctx"); 
Các vấn đề liên quan