《SLF4J官方文件》本地化支援
阿新 • • 發佈:2018-12-23
SLF4J-dev郵件列表上的一個討論產生了一種開源專案叫做CAL10N或編譯器輔助定位 。
正如其名所表示的,CAL10N專注於Java應用程式本地化/國際化的問題。
在CALI0N上,附帶SLF4J-EXT-1.7.21.jar的org.slf4j.cal10n包的頂部增加了一個非常薄的一層包以提供本地化的日誌記錄。
讓我們假設你已經在你的應用程式中定義本地化的訊息。 按照CAL10N的理念,你已經在列舉型別Production裡為訊息聲明瞭keys 。
import ch.qos.cal10n.LocaleData; import ch.qos.cal10n.Locale; import ch.qos.cal10n.BaseName; @BaseName("production") @LocaleData( { @Locale("en_UK"), @Locale("ja_JP") }) public enum Production { APPLICATION_STARTED, APPLICATION_STOPPED, ... DB_CONNECTION, DB_CONNECTION_FAILURE; }
假定你已經為不同的區域“en_UK”和“Ja_JP建立了相應的包檔案。 下面是“en_UK”區域的樣本包。
APPLICATION_STARTED=Application <strong>{0}</strong> has started. APPLICATION_STOPPED=Application <strong>{0}</strong> has stopped. ...
然後,您可以例項化一個IMessageConveyor ,它注入到一個LogLoggerFactory ,通過名稱例項和日誌檢索多個LogLogger,像下一個示例程式碼闡述的一樣。
import java.util.Locale; import org.slf4j.cal10n.LocLogger; import org.slf4j.cal10n.LocLoggerFactory; import ch.qos.cal10n.IMessageConveyor; import ch.qos.cal10n.MessageConveyor; public class MyApplication { // create a message conveyor for a given locale IMessageConveyor messageConveyor = new MessageConveyor(Locale.UK); // create the LogLoggerFactory LocLoggerFactory llFactory_uk = new LocLoggerFactory(messageConveyor); // create a locLogger LocLogger locLogger = llFactory_uk.getLocLogger(this.getClass()); public void applicationStart() { locLogger.info(Production.APPLICATION_STARTED, "fooApp"); // .. } public void applicationStop() { locLogger.info(Production.APPLICATION_STOPPED, "fooApp"); // ... } }
假設資源包production_en_UK.properties存在,並且底層的日誌框架開啟info級別日誌,日誌訊息將用英語[英國]輸出。
請注意, LogLogger是一個普通的SLF4J記錄器,它有額外支援本地化的方法。 對於那些需要一個列舉作為第一個引數的額外方法, LogLogger遵循引數替換的Java約定標準,這個標準是由java.text.MessageFormat類定義的。 對於非本地化的日誌,將一個字串作為第一個引數, LogLogger如下{}約定,作為慣例讓所有org.slf4j.Logger實現。
如下例子闡述了差別。
import ...; public class MyApplication { IMessageConveyor messageConveyor = new MessageConveyor(Locale.UK); LocLoggerFactory llFactory_uk = new LocLoggerFactory(messageConveyor); LocLogger locLogger = llFactory_uk.getLocLogger(this.getClass()); public void someMethod() { // follows the MessageFormat convention locLogger.info(Production.APPLICATION_STARTED, "fooApp"); // follows the {} convention logLogger.info("Hello {}", name); ... } }