《SLF4J官方文档》本地化支持

    xiaoxiao2024-05-16  119

    SLF4J-dev邮件列表上的一个讨论产生了一种开源项目叫做CAL10N或编译器辅助定位 。

    正如其名所表示的,CAL10N专注于Java应用程序本地化/国际化的问题。

    在CALI0N上,附带SLF4J-EXT-1.7.21.jar的org.slf4j.cal10n包的顶部增加了一个非常薄的一层包以提供本地化的日志记录。

    一旦你有一个上一个IMessageConveyor实例的句柄,你可以创建LocLoggerFactory ,这反过来又可以创造能够做本地化的日志记录的LocLogger实例。

    让我们假设你已经在你的应用程序中定义本地化的消息。 按照CAL10N的理念,你已经在枚举类型Production里为消息声明了keys 。

    01 import ch.qos.cal10n.LocaleData; 02 import ch.qos.cal10n.Locale; 03 import ch.qos.cal10n.BaseName; 04  05 @BaseName("production") 06 @LocaleData( { @Locale("en_UK"), @Locale("ja_JP") }) 07 public enum Production  { 08APPLICATION_STARTED, 09APPLICATION_STOPPED, 10... 11DB_CONNECTION, 12DB_CONNECTION_FAILURE; 13}

     

    假定你已经为不同的区域“en_UK”和“Ja_JP创建了相应的包文件。 下面是“en_UK”区域的样本包。

    1 APPLICATION_STARTED=Application <strong>{0}</strong> has started. 2  3 APPLICATION_STOPPED=Application <strong>{0}</strong> has stopped. 4  5...

    然后,您可以实例化一个IMessageConveyor ,它注入到一个LogLoggerFactory ,通过名称实例和日志检索多个LogLogger,像下一个示例代码阐述的一样。

    01 import java.util.Locale; 02  03 import org.slf4j.cal10n.LocLogger; 04 import org.slf4j.cal10n.LocLoggerFactory; 05  06 import ch.qos.cal10n.IMessageConveyor; 07 import ch.qos.cal10n.MessageConveyor; 08  09 public class MyApplication { 10  11// create a message conveyor for a given locale 12 IMessageConveyor  messageConveyor = new MessageConveyor(Locale.UK); 13  14// create the LogLoggerFactory 15 LocLoggerFactory llFactory_uk = new LocLoggerFactory(messageConveyor); 16  17// create a locLogger 18 LocLogger locLogger = llFactory_uk.getLocLogger(this.getClass()); 19  20 public void applicationStart() { 21 locLogger.info(Production.APPLICATION_STARTED, "fooApp"); 22// .. 23} 24  25 public void applicationStop() { 26 locLogger.info(Production.APPLICATION_STOPPED, "fooApp"); 27// ... 28} 29}

    假设资源包production_en_UK.properties存在,并且底层的日志框架开启info级别日志,日志消息将用英语[英国]输出。

    请注意, LogLogger是一个普通的SLF4J记录器,它有额外支持本地化的方法。 对于那些需要一个枚举作为第一个参数的额外方法, LogLogger遵循参数替换的Java约定标准,这个标准是由java.text.MessageFormat类定义的。 对于非本地化的日志,将一个字符串作为第一个参数, LogLogger如下{}约定,作为惯例让所有org.slf4j.Logger实现。

    如下例子阐述了差别。

    01 import ...; 02 public class MyApplication { 03  04 IMessageConveyor  messageConveyor = new MessageConveyor(Locale.UK); 05 LocLoggerFactory llFactory_uk = new LocLoggerFactory(messageConveyor); 06 LocLogger locLogger = llFactory_uk.getLocLogger(this.getClass()); 07  08 public void someMethod() { 09// follows the MessageFormat convention 10 locLogger.info(Production.APPLICATION_STARTED, "fooApp"); 11  12// follows the {} convention 13 logLogger.info("Hello {}", name); 14... 15} 16}

    转载自 并发编程网 - ifeve.com

    最新回复(0)