2012-08-10 68 views
2

我想本地化的Java应用程序中的消息。我正在使用基于Locale的ResourceBundle加载。本地化在log4j

我希望将控制台上的消息本地化,并且日志文件中的消息为英文。

我在做什么是这样的:

if (bundle != null) { 
    MessageFormat formatter = new MessageFormat(bundle.getString(message)); 
    Object [] messageArgument = new Object[] {"arg1"}; 
    logger.info(formatter.format(messageArgument)); 
    } 

我已经设置了ConsoleHandler阈值信息。 问题是,现在即使信息日志文件将包含本地化消息以及控制台。

有没有办法将英文消息记录到控制台的日志文件和本地化消息?

回答

2

编辑:完全重写

通常登录字符串时被传递给已经本地化,并在此之后不能转换的记录。然而,log4j中消息的类型是实际的对象,只有在框架后面才会被转换为实际的字符串。这是通过log4j在消息传递给appender之前完成的,但它看起来像appender仍然可以获取原始对象。所以似乎有可能为log4j编写自定义appender,并结合自定义消息类型来提供所需的行为,但它会很复杂。

我想你会更好地在控制台和log4j之上放置一层,然后让该句柄直接向控制台发送本地化消息并向log4j发送英语消息。

+0

但我需要设置信息阈值是ConsoleAppender。 因此,当我做logger.info()或logger.error()时,它会进入日志文件并出现在控制台上。 如果我加载英文包,控制台消息将不会本地化。 – cmn 2012-08-10 07:04:55

+0

@Chandramouli:你需要使用两个Bundles。一个初始化为英语另一个为您需要的任何语言 – 2012-08-10 07:06:30

+0

@a_horse_with_no_name 如果我理解正确,您建议我必须这样登录: log.info(englishMessage); log.info(localMessage); 即使这样也解决不了问题吧? – cmn 2012-08-10 07:18:07

0

如果你只是在做这个记录在一个地方(或几个),你可以记录写两个记录器实例:

if (bundle != null) { 
    MessageFormat formatter = new MessageFormat(bundle.getString(message)); 
    Object [] messageArgument = new Object[] {"arg1"}; 
    locale_logger.info(formatter.format(messageArgument)); 
    english_logger.info(message); 
} 
+0

请您详细说明如何在这种情况下初始化记录器? 目前,这是我在做什么: 'PropertyConfigurator.configure(CONFIGFILE);'' 记录= Logger.getLogger(的className);' 而CONFIGFILE是: “log4j.rootLogger =标准输出,信息日志 log4j.appender.STDOUT = org。apache.log4j.ConsoleAppender .. .. log4j.appender.STDOUT.threshold = INFO .. log4j.appender.INFOLOG.threshold = INFO ..” – cmn 2012-08-10 07:28:31

+0

你不必使用类名或类创建记录器时,可以使用任何字符串。 english_logger = Logger.getLogger(“English”);然后配置log4j只将这些消息写入附加的文件 – 2012-08-11 03:35:15