본문 바로가기
C#, MONO

로그(Log) 를 남기고, 오래된 로그 파일 자동 삭제

by gigasound 2021. 8. 14.


로그 남기기

 

프로그램 운영 관리를 위해서는 로그(Log) 파일을 생성하고, 프로그램 진행 상태를 로그로 남기도록 만들기도 합니다. 

로그 파일은 일간, 주간, 월간으로 새로운 파일을 만들고 기록하면 관리하게 가 편리합니다.

그런데 로그 파일을 무작정 기록하면, 누적된 파일의 크기가 문제가 됩니다. 특히 용량이 제한된 임베디드와 같은 소형 장비에서는 기록장치의 용량이 제한되어 있기 때문에 더욱 문제가 되기 때문이다.

그래서 누적 가능한 일자를 제한하여, 파일을 삭제하는 방법을 로그 파일에 함께 사용합니다.


MonoDevelop.TaskForce.Utilities의 LogUtil로 로그 파일 만들기

다음은 LOG 디렉터리에 날자별로 로그파일을 Text 내용으로 기록하고, 60일 간격으로 오래된 파일을 삭제하는 코드 내용입니다.

이 코드는 다음과 같이 동작합니다.  

  • 날자로 로그 파일을 만듭니다.
  • 원하는 내용을 기록하는 함수는 사용자 프로그램에 적당히 배치합니다.
  • 다음과 같을때 로그를 남기면 좋습니다.
    • 프로그램이 처음 구동될때, 특정값이 입력되거나, 특정 조건이 변경될때,
    • 그리고 프로그램이 정성적으로 종료될때, 비 정상적으로 종료 되면 종료 없이 구동 로그만 두번이상 남겠죠.
  • 프로그램이 시작될때 쓰레드로 Task_Log_Delete()를 실행합니다. 그러면 현재 시간을 기준으로 특정 시간 간격이전의 파일들을 찾아서 삭제합니다. 

 

//- 기록 디렉토리
private string cur_dir = "";
//- 기록 파일 초기
private string log_file = "";
//- 누적 일자
private  int date_gap = 30;

/// <summary>
/// Log를 위한 객체 생성, Thread 실행
/// </summary>
public LogUtil(int Date_Gap){
	//- 누적 일자
    this.date_gap = Date_Gap;
	//- 로그 기록 디렉토리
    this.cur_dir = System.IO.Directory.GetCurrentDirectory();
	this.cur_dir = Path.Combine(this.cur_dir,"LOG");
	DirectoryInfo di = new DirectoryInfo(this.cur_dir);
	if(di.Exists == false){ Directory.CreateDirectory(this.cur_dir); }
	//- 삭제 갱신용 쓰레드
    Thread xTaskLog = new Thread(new ThreadStart(Task_Log_Delate));
	xTaskLog.Start();
}

/// <summary>
/// 날짜에 따라 로그 파일을 생성
/// </summary>
private bool Log_file_Make(){
	this.log_file = DateTime.Today.ToString("yyyyMMdd") + ".log";
	this.log_file = Path.Combine(this.cur_dir,this.log_file);
	FileInfo fi = new FileInfo(this.log_file);
	return fi.Exists;
}

/// <summary>
/// 로그 내용을 기록하는 함수, 원하는 내용을 기록하도록 유도
/// </summary>
public void Log_Make(string msg){ 
	try{
		string d = DateTime.Now.ToString("yyyyMMdd-HHmmss");
		string str = string.Format("[{0}]{1}",d,msg);
		switch(this.Log_file_Make()){
			case false:
				using(StreamWriter w = new StreamWriter(this.log_file)){
					w.WriteLine(str);
					w.Close();
				}
				break;
			default:
				using(StreamWriter w = File.AppendText(this.log_file)){
					w.WriteLine(str);
					w.Close();
				}
				break;
		}
	}
	catch{ }
}

/// <summary>
/// 로그 삭제를 실행하는 쓰레드
/// </summary>
void Task_Log_Delate(){ 
	for(;;){ 
		for(int i =0;i<60;i++){ Thread.Sleep(60000); }
		this.Log_Delete();
	}
}

/// <summary>
/// 로그 파일을 날자 조건에 따라 삭제 
/// </summary>
void Log_Delete() {
	try{
		DirectoryInfo di = new DirectoryInfo(this.cur_dir);
		DateTime log_limit_time = DateTime.Now.AddDays(this.date_gap);
		foreach(FileInfo f in di.GetFiles()) {
			if(System.IO.Path.GetExtension(f.FullName) == ".log") {
				DateTime file_time = f.CreationTime;
				if(DateTime.Compare(file_time,log_limit_time) > 0) {
					File.Delete(f.FullName);
				}
			}
		}
	}
	finally{ }
}

참조 

MonoDevelop.TaskForce.Utilities

광고좀 꾹 눌러주시면 고맙겠습니다. 


위의 내용을 참조용으로만 사용해주세요. 무단 도용이나 무단 복제는 불허합니다.

기타 문의 사항은 gigasound@naver.com에 남겨 주시면 고맙겠습니다.

'C#, MONO' 카테고리의 다른 글

OS 알아보기  (0) 2021.08.14
프로그램 중복 실행 방지하기  (0) 2021.08.14
c#에서 ssh scp로 bash 명령어 실행 및 파일 전송  (0) 2021.08.11
c#과 Python의 연동  (1) 2021.08.11
Enum의 정보 변환 하기  (0) 2021.08.11