현재 기본 항목은 다음과 같습니다.
Oct 12, 2008 9:45:18 AM myClassInfoHere
INFO: MyLogMessageHere
이 작업을 수행하려면 어떻게해야합니까?
Oct 12, 2008 9:45:18 AM myClassInfoHere - INFO: MyLogMessageHere
설명 java.util.logging을 사용하고 있습니다.
현재 기본 항목은 다음과 같습니다.
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'
logging.properties
@BrunoEberhard의 제안과 단축 된 로거 이름을 기반으로 한 적응 : java.util.logging.SimpleFormatter.format=%1$tF %1$tT %4$.1s %2$s %5$s%6$s%n
-Djava.util.logging.SimpleFormatter.format
Java 7은 java.util.Formatter
형식 문자열 구문이 있는 속성을 지원 합니다.
-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
일반적으로 IDE를 사용하면 프로젝트의 시스템 속성을 설정할 수 있습니다. 예를 들어 NetBeans에서 -D ... = ...를 어딘가에 추가하는 대신 java.util.logging.SimpleFormatter.format=%1$tY-%1$tm-...
따옴표없이- 형식으로 작업 대화 상자에 속성을 추가 합니다. IDE가 알아 내야합니다.
편의를 위해 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>
관련 클래스 가 거의java.util.logging
없는 라이브러리가 있습니다 . 그중 SingleLineFormatter
. 여기에서 다운로드 할 수있는 항아리 .
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();
}
}
Tervor와 비슷하지만 런타임에 속성을 변경하고 싶습니다.
주석에 기록 된대로 첫 번째 SimpleFormatter가 생성되기 전에 설정해야합니다.
System.setProperty("java.util.logging.SimpleFormatter.format",
"%1$tF %1$tT %4$s %2$s %5$s%6$s%n");
Obediah Stane이 말했듯이, 자신 만의 format
방법 을 만들어야합니다 . 하지만 몇 가지를 변경하겠습니다.
에서 Formatter
가 아니라에서 직접 파생 된 하위 클래스를 만듭니다 SimpleFormatter
. 은 SimpleFormatter
더 이상 추가 아무 상관이 없습니다.
새 Date
개체 를 만들 때주의하십시오 ! 의 날짜를 표시해야합니다 LogRecord
. Date
기본 생성자 로 새 파일 을 만들 때이 생성 된 날짜가 아니라를 Formatter
처리하는 날짜와 시간을 나타냅니다 .LogRecord
LogRecord
다음 클래스는 할 수 포맷으로 사용 A의 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();
}
}
이것이 제가 사용하고있는 것입니다.
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!!!
ofNullable(record.getThrown()).ifPresent(v -> v.printStackTrace());
형식화 된 메시지를 반환하기 직전에.
나는 작동하는 방법을 알아 냈다. SimpleFormatter를 하위 클래스로 만들고 format 메서드를 재정의 할 수 있습니다.
public String format(LogRecord record) {
return new java.util.Date() + " " + record.getLevel() + " " + record.getMessage() + "\r\n";
}
이 API에 조금 놀랐습니다. 더 많은 기능 / 유연성이 즉시 제공 될 것이라고 생각했을 것입니다.
formatMessage(record)
보다는 record.getMessage()
. 자리 표시자는 변경되지 않습니다.
이 로깅은 일반 Java 기능이 아닌 응용 프로그램에만 해당됩니다. 어떤 응용 프로그램을 실행하고 있습니까?
이것은 자신의 코드 내에서 사용중인 특정 로깅 라이브러리에서 오는 것일 수 있습니다. 그렇다면 사용중인 세부 정보를 게시하십시오.
java.util.logging.Logger