IIS 나 log4net으로 만들어진 log file에 대해서 monitoring을 해야지 되는 경우에, 파일 로그의 특성상 가장 최근의 데이터는 언제나 파일의 끝부분에 위치하게 된다. 파일 자체도 끝부분이기도 하지만, 어디까지 파일을 읽어야지 되는지를 잘 파악하기 힘들게 된다.
잘 생각을 해보니.. 파일의 끝부분부터 모아서 string 변화를 시키고, 자신이 마지막에 읽었던 string 값과 비교해서 찾는 것이 방법을 사용해봤다.
그런데, 예전부터 사용되는 C에서의 파일처리와 비슷하게 해줘야지 되는 것 같아서.. 조금 애매하긴 하다.
차라리.. 기존에 읽었던 Byte의 Position을 기억해서, 그 부분부터 끝부분까지 읽는 방법은 어떨지 고민해봐야지 될 것 같다.
DateTime dtNow = DateTime.Now;
string fileName = string.Format("ex{0}.log", dtNow.ToString("yyMMdd"));
string lastReadLine = "7015289892;01051410960;1051410960;NB00000380;20081220095101";
using(FileStream fs = File.OpenRead("C:\\zordbs0200511-s06-호스트웨이.dat"))
{
long fileEndPosition = fs.Seek(0, SeekOrigin.End);
long currentPosition = fileEndPosition - 2;
fs.Position = fileEndPosition;
List<string> gettingStrings = new List<string>();
bool findOldText = false;
do
{
bool crlfFind = false;
List<byte> btDatas = new List<byte>();
string text;
do
{
//파일을 뒤에서부터 읽는 루틴
fs.Position = currentPosition;
btDatas.Add((byte) fs.ReadByte());
List<byte> btDatas2 = new List<byte>();
btDatas2.AddRange(btDatas);
btDatas2.Reverse();
text = Encoding.UTF8.GetString(btDatas2.ToArray());
crlfFind = text.Contains("\n");
currentPosition--;
} while (!crlfFind);
if(text.Contains(lastReadLine))
{
findOldText = true;
}
else
{
gettingStrings.Add(text);
}
} while (!findOldText);
foreach(string text in gettingStrings)
{
Console.WriteLine(text);
}
Console.ReadLine();
}