2013-06-10 21 views
10

W tej chwili w mojej aplikacji rejestrujemy niektóre pliki w plikach dziennika.Rejestrowanie asynchroniczne

Zasadniczo tylko dla rejestrowania tworzymy JSON dostępnych danych, a następnie logujemy się do plików dziennika. Jest to wymóg biznesowy do rejestrowania danych w formacie JSON.

Teraz tworzenie JSON z dostępnych danych, a następnie logowanie do pliku zajmuje dużo czasu i wpływa na pierwotny czas powrotu żądania. Teraz chodzi o poprawę położenia.

Jedną z rzeczy, które omówiliśmy jest stworzenie puli wątków używając

Executors.newSingleThreadExecutor() 

w naszym kodzie, a następnie przekazanie do niego zadanie, które wykonuje konwersję danych do formatu JSON i późniejszego logowania.

Czy to jest dobre podejście do tego? Ponieważ zarządzamy samą pulą wątków, czy spowoduje to pewne problemy?

Byłbym wdzięczny, gdyby ktoś mógł dzielić się lepszymi rozwiązaniami. W przypadku użycia Log4j do tego .Próbowałem użyć AsyncAppender, ale nie osiągnąłem pożądanego rezultatu. Używamy EJB 3, Jboss 5.0, Log4j, java6.

Odpowiedz

6

Uważam, że jesteś na dobrej drodze, jeśli chodzi o używanie oddzielnej puli wątków do rejestrowania. W wielu produktach zobaczysz funkcję rejestrowania asynchronicznego. Dzienniki są gromadzone i przesyłane do plików dziennika przy użyciu osobnego wątku niż wątek żądania. Zwłaszcza w środowiskach produkcyjnych, gdzie są miliony przychodzących żądań, a czas reakcji musi być krótszy niż kilka sekund. Nie możesz sobie pozwolić na nic takiego, jak logowanie, aby spowolnić system.Tak więc stosowane podejście polega na dodawaniu dzienników do bufora pamięci i przekazywaniu ich asynchronicznie w porcjach o rozsądnych rozmiarach.

Jedna uwaga podczas korzystania z puli wątków do logowania Jak wiele wątków będzie pracować na pliku dziennika (-ów) oraz bufor dziennika pamięć, trzeba być ostrożnym o logowaniu. Musisz dodać dzienniki do bufora typu FIFO, aby upewnić się, że dzienniki są drukowane w plikach dziennika posortowanych według sygnatury czasowej. Upewnij się również, że dostęp do pliku jest zsynchronizowany i nie uruchamia się sytuacja, w której plik dziennika jest do góry nogami lub popsuty.

+0

Dziękuję za danie mi pewności siebie, aby iść do przodu we właściwym kierunku. Ale martwię się tylko o to, że używam utworzonego przez aplikację wątku ... czy to spowoduje jakiś problem, czy też istnieje jakikolwiek sposób wykorzystania puli wątków jboss do tego. – Rips

3

Czy rozważa się korzystanie z MongoDB for logging?

  1. wkładki MongoDB można zrobić asynchronicznie. Nikt nie chciałby, aby doświadczenie użytkownika zatrzymywało się do zatrzymania, jeśli rejestrowanie było powolne, zatrzymane lub w dół. MongoDB zapewnia zdolność do odpalania wkładki do kolekcji dzienników i nie czekania na kod odpowiedzi. (Jeśli jeden chce odpowiedzi, jeden wywołuje getLastError() - pomijalibyśmy to tutaj.)
  2. Stare logi automatycznie LRU się kończą. Za pomocą kolekcji z ograniczeniami, , wstępnie przydzielamy miejsce na dzienniki, a gdy jest on pełny, dziennik opakowuje i ponownie wykorzystuje podaną przestrzeń. Brak ryzyka zapełnienia dysku z nadmiernymi informacjami o dzienniku, bez konieczności pisania skryptów archiwizacji/archiwizacji dzienników/ .
  3. Jest wystarczająco szybki, aby rozwiązać problem. Po pierwsze, MongoDB jest bardzo szybki w ogólności, wystarczająco szybki dla takich problemów. Po drugie, przy korzystaniu z kolekcji z ograniczonymi limitami, zamówienie reklamowe jest automatycznie zachowywane: my nie trzeba tworzyć indeksu na znaczniku czasu. To sprawia, że ​​rzeczy stają się jeszcze szybsze i ważniejsze, biorąc pod uwagę, że przypadek użycia rejestrowania ma bardzo dużą liczbę zapisów w porównaniu do odczytów (przeciwieństwo większości problemów z bazą danych ).
  4. Zorientowany na dokumenty/JSON to doskonały format do informacji o dzienniku. Bardzo elastyczny i "bezmyślny" w tym sensie, że możemy rzucić dodatkowe pole o dowolnej porze.
+1

Well dzięki za udostępnienie tego, ale nie sądzę, że będziemy teraz drogę. – Rips

5

Spójrz na , AsyncAppender to już osobny wątek, kolejka itp. I jest łatwo konfigurowalna, prawie robi to samo, co robisz, ale oszczędza od ponownego wynalezienia koła.

+0

Czy jest jakaś różnica między tym i log4j.AsyncAppender? Również w ramach tego nie chcę tylko logować asychronosuly, ale także konwertować dane do JSON. – Rips

+0

@Rips Jeśli masz również inne zadanie (np. Konwersję danych), twoje rozwiązanie jest również w porządku. Jeśli chodzi o log4j vs logback, rozwój log4j jest zatrzymany i logback jest aktywny. Aby uzyskać więcej informacji o log4j vs logback spojrzeć na to [link] (http://stackoverflow.com/questions/178215/log4j-vs-logback) –

0

Możesz także spróbować CoralLog do asynchronicznego danych przy użyciu wzorca Zakłócacza zalogować. W ten sposób spędzasz minimalny czas w wątku rejestratora, a cała ciężka praca jest przekazywana do wątku wykonującego rzeczywiste operacje we/wy pliku. Zapewnia również pliki mapowane w pamięci, aby przyspieszyć wątek konsumenta i zmniejszyć rywalizację o kolejkę.

Zastrzeżenie: Jestem jednym z twórców CoralLog