본문 바로가기
FullStack/21. Java

[Java] Log Tail 기능

by nakanara 2021. 3. 9.
반응형

컨테이너로 서버를 운영하면서 로그 확인의 불편하여,
로그백을 이용해서 기록되고 있는 로그를 웹으로 보여주기 위한 기능 구현

  • 요청하는 곳에서 로그 읽기를 시작할 위치와 함께 요청
  • 요청 전 해당 파일을 위치 파악 후 사용하여 Tail 기능으로 사용
  • byte단위까지 판단하기에는 너무 깊게 들어가는 것 같아서 라인 단위로 읽어가는 가는 방식으로 구현
  • 로그파일이 UTF-8의 경우 RandomAccessFile를 이용하여 읽는 경우 한글 깨짐이 발생하여 인코딩 처리

LogTail.java


import java.io.*;

/**
 * 파일의 현재 위치와 현재 위치부터 지정된 라인을 읽을서 전달하도록
 */
public class LogTail {

  // 파일 명
  private String fname;
  // 기본 읽을 라인 수
  private final static int DEF_LINE = 40;

  /**
    * 파일명으로 객체 생성
    * @param fname
    */
  public LogTail(String fname){
      this.fname = fname;
  }

  private void fullLog(){
  }

  /**
    * 파일 마지막 위치
    * @return 파일의 마지막 위치
    */
  public long getFileLastPosition() {

      File file = new File(this.fname);
      return file.length();
  }

  /**
    * 파일의 내용 읽기
    * @param pos 읽기 시작 위치
    * @return
    */
  public LogTailResult read(long pos) {
      return read(pos, DEF_LINE);
  }
  /**
    * 지정된 위치부터 지정된 라인까지 읽어오기
    * @param pos 읽기 시작 위치
    * @param linesize 읽을 라인 수
    * @return
    */
  public LogTailResult read(long pos, int linesize){

      String curLine;
      int curLineCount = 0;
      long curLastPos = getFileLastPosition();

      // 마지막 위치보다 크게 들어오는 경우 마지막 위치로 설정
      if(pos > 0 && pos > curLastPos) {
          pos = curLastPos;
      }

      LogTailResult logTailResult = new LogTailResult();

      // 파일 읽기 모드
      try(RandomAccessFile raf = new RandomAccessFile(this.fname, "r")) {

          // 읽을 위치로 이동
          if(pos > 0) {
              raf.seek(pos);
          }

          while( (curLine = raf.readLine()) != null ) {

              // UTF-8파일의 경우 한글깨짐으로 변환 작업
              String msg = (new String(curLine.getBytes("ISO-8859-1"), "UTF-8"));
              logTailResult.addResult( msg ).addResult("\n"); // 개행 문자 추가
              curLineCount++;

              // 읽기 위한 라인 체크
              if(curLineCount >= linesize) {
                  break;
              }
          }

          // 현재 위치 함께 전달하여
          // 요청 시 읽기 위한 시점점을 함께 요청
          logTailResult.setCurPosition(raf.getFilePointer());

      }catch(IOException ioe) {
          ioe.printStackTrace();
      }

      return logTailResult;
  }
}

LogTailResult

로그 읽은 결과 전달 객체

/**
 * 로그 전달 객체
 */
public class LogTailResult {

  // 로그를 읽을 시작 위치
  private long startPosition = 0;
  // 읽은 최종 위치
  private long curPosition = 0;
  // 읽은 로그
  private StringBuffer buf = new StringBuffer();

  public long getStartPosition() {
      return startPosition;
  }

  public void setStartPosition(long startPosition) {
      this.startPosition = startPosition;
  }

  public long getCurPosition() {
      return curPosition;
  }

  public void setCurPosition(long curPosition) {
      this.curPosition = curPosition;
  }

  public LogTailResult addResult(String s) {
      buf.append(s);
      return this;
  }

  public String getResults(){
      return buf.toString();
  }
}

#파일읽기 #randomaccess #logtail #tail #logback

반응형

'FullStack > 21. Java' 카테고리의 다른 글

[Java] Exception getMessage, getLocalizedMessage  (0) 2021.03.31
[Java] AES-256 암호화  (0) 2021.03.12
[MAVEN] 로컬 jar 참조하기  (0) 2021.02.09
[Logback] 로그파일 경로 확인 방법  (0) 2021.02.09
[Java] 초성 추출하기  (0) 2021.01.29