在 Java 中使用 Logger 做国际化(i18n),核心思路是:日志消息不直接写死字符串,而是使用“消息 Key + 资源文件(ResourceBundle)”来根据语言环境输出不同语言的日志。
下面按常见方式说明。
log.user.login.success)ResourceBundle 存放不同语言的消息模板Locale 从 ResourceBundle 中取消息messages_en.properties
log.user.login=User {0} logged in
log.user.logout=User {0} logged out
messages_zh.properties
log.user.login=用户 {0} 登录成功
log.user.logout=用户 {0} 退出登录
import java.util.*;
import java.util.logging.*;
public class I18nLoggerExample {
public static void main(String[] args) {
Locale locale = Locale.CHINESE; // 可动态切换
ResourceBundle bundle = ResourceBundle.getBundle("messages", locale);
Logger logger = Logger.getLogger("com.example");
logger.setResourceBundle(bundle);
logger.log(Level.INFO, "log.user.login", "Alice");
}
}
✅ 输出(中文环境):
用户 Alice 登录成功
JUL 会自动使用 MessageFormat 处理 {0} {1}
logger.log(Level.INFO, "log.user.login", new Object[]{"Bob"});
SLF4J 本身不负责国际化,需要自己处理
Locale locale = Locale.ENGLISH;
ResourceBundle bundle = ResourceBundle.getBundle("messages", locale);
String msg = bundle.getString("log.user.login");
logger.info(MessageFormat.format(msg, "Alice"));
public class I18nLogger {
private static final Logger log = LoggerFactory.getLogger(I18nLogger.class);
public static void info(Locale locale, String key, Object... args) {
ResourceBundle bundle = ResourceBundle.getBundle("messages", locale);
String pattern = bundle.getString(key);
String msg = MessageFormat.format(pattern, args);
log.info(msg);
}
}
使用:
I18nLogger.info(Locale.CHINESE, "log.user.login", "Alice");
Log4j2 原生支持国际化
Logger logger = LogManager.getLogger("i18nLogger");
messages_en.properties
messages_zh.properties
logger.info("log.user.login", "Alice");
Log4j2 会根据 Locale.getDefault() 自动选择语言。
✅ 日志中保留 Key(可选)
logger.info("{} | {}", "log.user.login", MessageFormat.format(msg, user));
✅ 异常信息不国际化
✅ 用户界面 vs 日志
| 方案 | 国际化支持 | 推荐度 |
|---|---|---|
| JUL | 原生支持 | ⭐⭐⭐ |
| SLF4J + Logback | 手动 | ⭐⭐⭐⭐ |
| Log4j2 | 原生 | ⭐⭐⭐⭐⭐ |
如果你告诉我 用的是哪种日志框架(Logback / Log4j2 / JUL),我可以给你一份可直接用的完整示例。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。