能否在Eclipse中将Java标准输出与Log4j输出分至不同控制台?
在Eclipse中分离System.out和Log4j日志到不同控制台
当然可以实现这个需求!我之前在项目里就用过两种实用方法来区分这两类输出,下面给你详细说明:
方法一:控制台过滤+Log4j前缀标记(简单易上手)
这种方法不需要额外写代码,靠Eclipse自带的控制台过滤功能就能快速搞定:
第一步:给Log4j日志加统一前缀
修改你的Log4j配置文件(比如log4j.properties或log4j.xml),给所有Log4j输出的日志加上独特前缀,比如[LOG4J]:# 示例log4j.properties配置 log4j.rootLogger=INFO, stdout log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout # 关键:在转换模式开头加上[LOG4J]前缀 log4j.appender.stdout.layout.ConversionPattern=[LOG4J] %d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n这样Log4j的每一条日志都会以
[LOG4J]开头,而System.out.println()的输出不会有这个标记。第二步:打开第二个控制台视图
在Eclipse顶部菜单栏点击Window > Show View > Other,找到Console视图后点击打开——如果已经有一个控制台了,这会创建第二个独立的控制台窗口。第三步:给两个控制台设置过滤规则
- 选中第一个控制台,点击右上角的过滤器图标(漏斗形状),选择
Edit Filter...。点击Add,在String to match中输入[LOG4J],勾选Match any,确定后这个控制台就只会显示Log4j的日志了。 - 选中第二个控制台,同样打开过滤器,添加规则输入
[LOG4J],但这次勾选Exclude——这样这个控制台会自动屏蔽Log4j的输出,只显示System.out的内容。
- 选中第一个控制台,点击右上角的过滤器图标(漏斗形状),选择
方法二:自定义Log4j Appender(更优雅,无前缀)
如果觉得前缀不够美观,可以写一个简单的自定义Appender,让Log4j直接输出到Eclipse的专属控制台:
第一步:编写自定义Appender类
创建一个继承自AppenderSkeleton的类,关联Eclipse的MessageConsole:import org.apache.log4j.AppenderSkeleton; import org.apache.log4j.Layout; import org.apache.log4j.spi.LoggingEvent; import org.eclipse.ui.console.MessageConsole; import org.eclipse.ui.console.MessageConsoleStream; public class EclipseLog4jConsoleAppender extends AppenderSkeleton { private static final String LOG4J_CONSOLE_NAME = "Log4j专属控制台"; private MessageConsoleStream consoleStream; public EclipseLog4jConsoleAppender() { // 创建新的Eclipse控制台 MessageConsole log4jConsole = new MessageConsole(LOG4J_CONSOLE_NAME, null); log4jConsole.activate(); consoleStream = log4jConsole.newMessageStream(); } @Override protected void append(LoggingEvent loggingEvent) { // 输出格式化后的日志到专属控制台 consoleStream.write(this.layout.format(loggingEvent)); // 处理异常栈信息 if (!layout.ignoresThrowable()) { String[] throwableLines = loggingEvent.getThrowableStrRep(); if (throwableLines != null) { for (String line : throwableLines) { consoleStream.write(line); consoleStream.write(Layout.LINE_SEP); } } } consoleStream.flush(); } @Override public void close() { try { consoleStream.close(); } catch (Exception e) { // 忽略关闭异常 } } @Override public boolean requiresLayout() { return true; } }第二步:配置Log4j使用这个Appender
修改Log4j配置文件,让根Logger使用我们的自定义Appender:log4j.rootLogger=INFO, log4jConsole # 指定自定义Appender log4j.appender.log4jConsole=com.your.package.EclipseLog4jConsoleAppender log4j.appender.log4jConsole.layout=org.apache.log4j.PatternLayout log4j.appender.log4jConsole.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n启动项目后,Eclipse会自动弹出名为
Log4j专属控制台的新窗口,所有Log4j日志都会在这里显示,而System.out的输出依然留在默认控制台。
内容的提问来源于stack exchange,提问作者khouloud
相关产品推荐
相关产品推荐

