如何让java日志输出出现在单行上?

目前,默认条目看起来像这样:

Oct 12, 2008 9:45:18 AM myClassInfoHere INFO: MyLogMessageHere 

我怎样才能做到这一点?

 Oct 12, 2008 9:45:18 AM myClassInfoHere - INFO: MyLogMessageHere 

澄清我正在使用java.util.logging

从Java 7开始, java.util.logging.SimpleFormatter支持从系统属性中获取其格式 ,因此,在JVM命令行中添加如下内容将导致它在一行上打印:

 -Djava.util.logging.SimpleFormatter.format='%1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS %4$s %2$s %5$s%6$s%n' 

或者,您也可以将其添加到您的logger.properties

 java.util.logging.SimpleFormatter.format='%1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS %4$s %2$s %5$s%6$s%n' 

1) -Djava.util.logging.SimpleFormatter.format

Java 7支持具有java.util.Formatter格式string语法的属性。

 -Djava.util.logging.SimpleFormatter.format=... 

看到这里 。

我最喜欢的是:

 -Djava.util.logging.SimpleFormatter.format=%1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS %4$-6s %2$s %5$s%6$s%n 

这使得输出如下所示:

 2014-09-02 16:44:57 SEVERE org.jboss.windup.util.ZipUtil unzip: Failed to load: foo.zip 

2)把它放到IDE中

IDE通常允许您为项目设置系统属性。 例如,在NetBeans中,而不是添加-D … = …某处,在操作对话框中添加属性,格式为java.util.logging.SimpleFormatter.format=%1$tY-%1$tm-... – 没有任何引号。 IDE应该弄清楚。

3)把它放到Maven – Surefire

为了您的方便,下面是如何把它放在Surefire:

  <!-- Surefire --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.17</version> <configuration> <systemPropertyVariables> <!-- Set JUL Formatting --> <java.util.logging.SimpleFormatter.format>%1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS %4$-6s %2$s %5$s%6$s%n</java.util.logging.SimpleFormatter.format> </systemPropertyVariables> </configuration> </plugin> 

4)手工制作

我有一个与java.util.logging相关的类很less的库。 其中,它是SingleLineFormatter 。 可下载的jar 在这里 。

 public class SingleLineFormatter extends Formatter { Date dat = new Date(); private final static String format = "{0,date} {0,time}"; private MessageFormat formatter; private Object args[] = new Object[1]; // Line separator string. This is the value of the line.separator // property at the moment that the SimpleFormatter was created. //private String lineSeparator = (String) java.security.AccessController.doPrivileged( // new sun.security.action.GetPropertyAction("line.separator")); private String lineSeparator = "\n"; /** * Format the given LogRecord. * @param record the log record to be formatted. * @return a formatted log record */ public synchronized String format(LogRecord record) { StringBuilder sb = new StringBuilder(); // Minimize memory allocations here. dat.setTime(record.getMillis()); args[0] = dat; // Date and time StringBuffer text = new StringBuffer(); if (formatter == null) { formatter = new MessageFormat(format); } formatter.format(args, text, null); sb.append(text); sb.append(" "); // Class name if (record.getSourceClassName() != null) { sb.append(record.getSourceClassName()); } else { sb.append(record.getLoggerName()); } // Method name if (record.getSourceMethodName() != null) { sb.append(" "); sb.append(record.getSourceMethodName()); } sb.append(" - "); // lineSeparator String message = formatMessage(record); // Level sb.append(record.getLevel().getLocalizedName()); sb.append(": "); // Indent - the more serious, the more indented. //sb.append( String.format("% ""s") ); int iOffset = (1000 - record.getLevel().intValue()) / 100; for( int i = 0; i < iOffset; i++ ){ sb.append(" "); } sb.append(message); sb.append(lineSeparator); if (record.getThrown() != null) { try { StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw); record.getThrown().printStackTrace(pw); pw.close(); sb.append(sw.toString()); } catch (Exception ex) { } } return sb.toString(); } } 

就像Obediah Stane所说的,有必要创build自己的format方法。 但是我会改变一些东西:

  • 创build一个直接派生自Formatter的子类,而不是来自SimpleFormatterSimpleFormatter没有什么可添加的了。

  • 小心创build一个新的Date对象! 您应该确保表示LogRecord的date。 使用默认构造函数创build新Date时,它将表示Formatter处理LogRecord的date和时间,而不是LogRecord创builddate。

下面的类可以在Handler 用作格式器 ,而Handler又可以添加到Logger 。 请注意,它忽略了LogRecord可用的所有类和方法信息。

 import java.io.PrintWriter; import java.io.StringWriter; import java.util.Date; import java.util.logging.Formatter; import java.util.logging.LogRecord; public final class LogFormatter extends Formatter { private static final String LINE_SEPARATOR = System.getProperty("line.separator"); @Override public String format(LogRecord record) { StringBuilder sb = new StringBuilder(); sb.append(new Date(record.getMillis())) .append(" ") .append(record.getLevel().getLocalizedName()) .append(": ") .append(formatMessage(record)) .append(LINE_SEPARATOR); if (record.getThrown() != null) { try { StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw); record.getThrown().printStackTrace(pw); pw.close(); sb.append(sw.toString()); } catch (Exception ex) { // ignore } } return sb.toString(); } } 

类似于Tervor,但我喜欢在运行时更改属性。

请注意,这需要在创build第一个SimpleFormatter之前设置 – 就像在注释中所写的那样。

  System.setProperty("java.util.logging.SimpleFormatter.format", "%1$tF %1$tT %4$s %2$s %5$s%6$s%n"); 

Eclipse配置

在截图中,在Eclipse中select“运行方式”,然后select“运行configuration…”,并用Trevor Robinson的答案加双引号而不是引号。 如果你错过了双引号,你会得到“无法find或加载主类”的错误。

这是我正在使用的。

 public class VerySimpleFormatter extends Formatter { private static final String PATTERN = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"; @Override public String format(final LogRecord record) { return String.format( "%1$s %2$-7s %3$s\n", new SimpleDateFormat(PATTERN).format( new Date(record.getMillis())), record.getLevel().getName(), formatMessage(record)); } } 

你会得到像…

 2016-08-19T17:43:14.295+09:00 INFO Hey~ 2016-08-19T17:43:16.068+09:00 SEVERE Seriously? 2016-08-19T17:43:16.068+09:00 WARNING I'm warning you!!! 

我已经想出了一个可行的方法。 您可以inheritanceSimpleFormatter并覆盖格式方法

  public String format(LogRecord record) { return new java.util.Date() + " " + record.getLevel() + " " + record.getMessage() + "\r\n"; } 

有点惊讶于这个API我会认为更多的function/灵活性将提供现成的

此日志logging特定于您的应用程序,而不是一般的Javafunction。 你正在运行什么应用程序?

这可能是来自您在自己的代码中使用的特定日志logging库。 如果是这样,请发布您正在使用哪一个的细节。

如果你使用tomcatlogin一个web应用程序add:

 -Djava.util.logging.ConsoleHandler.formatter = org.apache.juli.OneLineFormatter 

在VM参数上

如果你使用的是java.util.logging,那么就有一个configuration文件来logging内容(除非你使用的是编程configuration)。 所以,你的select是
1)运行后处理器,删除换行符
2)更改日志configuration并从中删除换行符。 重新启动您的应用程序(服务器),你应该是好的。