반응형
컨테이너로 서버를 운영하면서 로그 확인의 불편하여,
로그백을 이용해서 기록되고 있는 로그를 웹으로 보여주기 위한 기능 구현
- 요청하는 곳에서 로그 읽기를 시작할 위치와 함께 요청
- 요청 전 해당 파일을 위치 파악 후 사용하여 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 |