programing

Java 로깅 출력을 한 줄에 표시하려면 어떻게 해야 합니까?

newsource 2022. 10. 6. 21:58

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형식 문자열 구문

-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) 핸드메이드

나는 관련 수업이 적은 도서관을 가지고 있다.그 중에서도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");

오베디아 스테인이 말한 것처럼, 당신만의 것을 만들 필요가 있다.format방법.하지만 몇 가지를 바꾸고 싶습니다.

  • 직접 파생된 서브클래스를 만듭니다.Formatter~부터가아닙니다.SimpleFormatter.그SimpleFormatter더 이상 추가할 것이 없습니다.

  • 신규 작성에 주의해 주세요.Date오브젝트!다음 날짜를 반드시 표시해야 합니다.LogRecord. 신규 작성 시Date디폴트 컨스트럭터를 사용하면, 이 디폴트 컨스트럭터는, 이 디폴트 컨스트럭터의 날짜와 시각을 나타냅니다.Formatter처리하다LogRecord, 의 날짜가 아닙니다.LogRecord작성되었습니다.

다음 클래스는 포메터로 사용할 수 있습니다.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!!!

Eclipse config

스크린샷별로 Eclipse에서 "다른 이름으로 실행"을 선택한 다음 "구성 실행...." 그리고 Trevor Robinson의 답변을 따옴표 대신 큰따옴표로 추가합니다.큰따옴표를 놓치면 "could find or load main class" 오류가 나타납니다.

내가 방법을 알아냈어SimpleFormatter를 하위 클래스로 분류하여 포맷 메서드를 재정의할 수 있습니다.

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

이 API에 조금 놀랐을 때 더 많은 기능/유연성이 제공되었을 것이라고 생각했습니다.

Tomcat add를 사용하여 웹 응용 프로그램에 로그인하는 경우:

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

VM 인수

이 로깅은 일반적인 Java 기능이 아닌 응용 프로그램에 고유합니다.어떤 애플리케이션을 실행하고 있습니까?

사용자 자신의 코드 내에서 사용하고 있는 특정 로깅 라이브러리에서 발생한 것일 수 있습니다.그렇다면 어떤 제품을 사용하고 있는지 자세히 게시해 주세요.

.http.http.http.http.http.http.http.http.htp.htp..http.http.http.http.http.http. http.htp. http.htp.htp.htp.htp.htp.htp..htp그러면 옵션은 다음과 같습니다.
1)합니다 1) 줄 바꿈을 삭제합니다.
합니다.2) 로그 설정을 변경해 주세요.애플리케이션(서버)을 재기동하면, 문제가 없습니다.

언급URL : https://stackoverflow.com/questions/194765/how-do-i-get-java-logging-output-to-appear-on-a-single-line