1. 程式人生 > >《SLF4J官方文件》本地化支援

《SLF4J官方文件》本地化支援

原文地址

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);
...
}
}