2009-07-28 17 views
8

Mam plik dziennika, który stale rejestruje krótkie linie. Muszę opracować usługę, która reaguje (lub odpytuje lub słucha) na nowe wiersze dodane do tego pliku, rodzaj unixowego "programu ogonowego", więc moja usługa zawsze aktualizuje ten plik.C#: ogon jak program do pliku tekstowego

Nie sądzę, że otwarcie strumienia odczytu i podtrzymanie go jest dobrym pomysłem. Może powinienem użyć klasy FileSystemWatcher.

Krótko mówiąc, muszę analizować w czasie rzeczywistym każdą nową linię dodaną do tego pliku.

Każda pomoc lub wskazówka na temat pomysłu jest naprawdę doceniana.

EDIT

Jak byłem niezbyt jasne. Nie potrzebuję żadnego programu, jestem pisanie programu. Do czytania (następnie przetwarzania) każdej nowej linii dodanej do pliku. Mam na myśli to, czego szukam, to metodologia (lub: jak to zaimplementować?) Dla ciągłego ogłaszania pliku, który ciągle jest zapisywany.

Muszę opracować usługę Windows, która "słucha" tego pliku i wykonuje operacje na każdej nowej linii.

Tak więc, jeśli w danym momencie plik jest:

12.31.07 - jdoe [log on] 347 
12.32.08 - ssmith [log on] 479 
12.32.08 - mpeterson [log off] 532 
12.32.09 - apacino [log on] 123 

w tym samym momencie, że linia

12.32.11 - pchorr [log on] 127 

jest dodawany do pliku dziennika w programie logowania (który mam brak dostępu do), potrzebuję mojej usługi Windows, aby "zareagować" na uzależnienie linii, przechwycić nową linię (12.32.11 - pchorr [log on] 127) i przetworzyć ją. I tak dalej.

Teraz nie wiem, jak to zrobić. Powinienem odpytywać plik co n sekund, przechowywać ostatnią linię odczytu w pamięci i przetwarzać tylko nowo dodane linie. Problem polega na tym, że jest bardzo powolny, a za każdym razem czytałbym bardzo duży plik.

A może mógłbym użyć FileSystemWatcher, ale nie znalazłem żadnego przykładu użycia go do podobnych celów.

Co sugerujesz, aby wykonać pracę? Dzięki.

+1

Dlaczego nie możesz użyć ogona? – Alan

+3

Myślę, że chce przeprowadzić przetwarzanie na liniach, które są dodawane do pliku dziennika, a nie po prostu wyświetlać je tak, jak robi to ogon i chciałby wiedzieć najlepszy sposób monitorowania dziennika i czytania w liniach. – drs9222

Odpowiedz

9

Zalecam użycie FileSystemWatcher, aby otrzymywać powiadomienia o zmianach w pliku lub plikach, których dotyczy problem. Stamtąd będę zapisywać w pamięci podręcznej informacje, takie jak rozmiar pliku między zdarzeniami i dodać trochę logiki, aby odpowiadać tylko na pełne linie itp. Możesz użyć metody Seek() klasy FileStream, aby przeskoczyć do określonego miejsca w pliku i przeczytać tylko stamtąd. Biorąc pod uwagę te funkcje, nie powinno być zbyt trudno ręcznie uruchomić tę funkcję, jeśli jest to potrzebne.

0

Tak naprawdę nie wyjaśniłeś, czy potrzebujesz programu podobnego do ogona dla systemu Windows, np. http://www.baremetalsoft.com/baretail/, czy chcesz wersję okna z ogonem (użyj cygwin) lub jeśli szukasz jakiegoś interfejsu API do monitorowania dzienników. ..

7

Proste rozwiązanie byłoby użycie, przykładowy kod zawarty w artykule http://www.codeproject.com/Articles/7568/Tail-NET. Jest to tylko jedna funkcja kopiowania/wklejania do kodu.

+0

Jeśli odpytujesz, jest to najprostsze. Jeśli nie odpytujesz, FileSystemWatcher będzie lepszy. –

1

Należy zauważyć, że Microsoft (od wersji vista/svr08) nie aktualizuje już metadanych pliku, gdy plik jest aktualizowany (np. Plik dziennika aktualizowany przez usługę).

Na przykład metadanych dla pliku, takie jak data modyfikacji, nie zostaną zaktualizowane aż plik jest zamknięte przez służby/program, który aktualizuje plik dziennika.

W związku z tym FileSystemWatcher NIE będzie przechwytywał aktualizacji plików dziennika, jak można się spodziewać.

https://blogs.technet.microsoft.com/asiasupp/2010/12/14/file-date-modified-property-are-not-updating-while-modifying-a-file-without-closing-it/

Powiązane problemy