자바 실시 간 모니터링 로그 파일 및 출력 방법 상세 설명
최근 한 은행 데이터 표백 시스템 이 운영 자 에 게 페이지 에서 원 격 리 눅 스 서버 의 셸 을 호출 하고 셸 이 출력 한 정 보 를 로그 파일 에 저장 하도록 요구 하고 있 습 니 다.프론트 페이지 는 로그 파일 의 내용 을 실시 간 으로 표시 해 야 합 니 다.이 문 제 는 어떤 데이터 가 새로 추 가 했 는 지 판단 하 는 데 어려움 이 있 습 니 다.JDK 의 도움말 문 서 를 보면 서
java.io.RandomAccessFile
이 문 제 를 해결 할 수 있 습 니 다.이 문 제 를 모 의 하기 위해 LogSvr 와 LogView 류 를 작성 합 니 다.LogSvr 는 mock.log 로그 파일 에 데 이 터 를 계속 쓰 고 LogView 는 로그 변화 부분의 데 이 터 를 실시 간 으로 출력 합 니 다.코드 1:로그 생 성 클래스
package com.bill99.seashell.domain.svr;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
/**
*<p>title: </p>
*<p>Description: </p>
*<p>CopyRight: CopyRight (c) 2010</p>
*<p>Company: 99bill.com</p>
*<p>Create date: 2010-6-18</P>
*@author Tank Zhang<[email protected]>
*@version v0.1 2010-6-18
*/
public class LogSvr {
private SimpleDateFormat dateFormat =
new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
/**
*
* @param logFile
* @param mesInfo
* @throws IOException
*/
public void logMsg(File logFile,String mesInfo) throws IOException{
if(logFile == null) {
throw new IllegalStateException("logFile can not be null!");
}
Writer txtWriter = new FileWriter(logFile,true);
txtWriter.write(dateFormat.format(new Date()) +"\t"+mesInfo+"
");
txtWriter.flush();
}
public static void main(String[] args) throws Exception{
final LogSvr logSvr = new LogSvr();
final File tmpLogFile = new File("mock.log");
if(!tmpLogFile.exists()) {
tmpLogFile.createNewFile();
}
// 5
ScheduledExecutorService exec =
Executors.newScheduledThreadPool(1);
exec.scheduleWithFixedDelay(new Runnable(){
public void run() {
try {
logSvr.logMsg(tmpLogFile, " 99bill test !");
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}, 0, 5, TimeUnit.SECONDS);
}
}
코드 2:로그 클래스 표시
package com.bill99.seashell.domain.client;
import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class LogView {
private long lastTimeFileSize = 0; //
/**
*
* @param logFile
* @throws IOException
*/
public void realtimeShowLog(File logFile) throws IOException{
//
final RandomAccessFile randomFile = new RandomAccessFile(logFile,"rw");
// 10
ScheduledExecutorService exec =
Executors.newScheduledThreadPool(1);
exec.scheduleWithFixedDelay(new Runnable(){
public void run() {
try {
//
randomFile.seek(lastTimeFileSize);
String tmp = "";
while( (tmp = randomFile.readLine())!= null) {
System.out.println(new String(tmp.getBytes("ISO8859-1")));
}
lastTimeFileSize = randomFile.length();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}, 0, 1, TimeUnit.SECONDS);
}
public static void main(String[] args) throws Exception {
LogView view = new LogView();
final File tmpLogFile = new File("mock.log");
view.realtimeShowLog(tmpLogFile);
}
}
LogSvr 류 를 실행 하면 LogSvr 류 는 하나의 스 레 드 를 시작 합 니 다.5 초 마다 mock.log 로그 파일 에 데 이 터 를 한 번 쓴 다음 LogView 류 를 실행 합 니 다.LogView 는 1 초 간격 으로 읽 습 니 다.데이터 가 변 하면 변 화 된 부분 을 출력 합 니 다.결과 출력:
2010-06-19 17:25:54 99bill test !
2010-06-19 17:25:59 99bill test !
2010-06-19 17:26:04 99bill test !
2010-06-19 17:26:09 99bill test !
2010-06-19 17:26:14 99bill test !
2010-06-19 17:26:19 99bill test !
PS:코드 가 수정 되 었 습 니 다.어떤 친구 가 제 코드 를 다운 받 았 습 니 다.중국어 라면 번 거 로 울 것 이 라 고 로그 출력 류 의 30 줄 코드 를 다운 받 았 습 니 다.
System.out.println(tmp)
을System.out.println(new String(tmp.getBytes("ISO8859-1")))
로 바 꾸 면 중국어 가 정상적으로 표 시 됩 니 다.총결산
이상 은 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 댓 글 을 남 겨 주 셔 서 저희 에 대한 지지 에 감 사 드 립 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.