如何让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
的子类,而不是来自SimpleFormatter
。SimpleFormatter
没有什么可添加的了。 -
小心创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中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并从中删除换行符。 重新启动您的应用程序(服务器),你应该是好的。