잊지 않겠습니다.

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();
            }

Posted by Y2K
,