2012-05-31 11 views
5

Mam zamiar przeprowadzić migrację wcześniej utworzonej aplikacji WWW Java na platformę Azure. Aplikacja poprzednio użyła log4j dla dzienników aplikacji, które zostały zapisane w pliku utworzonym lokalnie. Problem polega na tym, że w przypadku roli Azure o wielu wystąpieniach muszę gromadzić i agregować te dzienniki, a także upewnić się, że są przechowywane w trwałym magazynie zamiast na dysku twardym maszyn wirtualnych.Logowanie do serwera Azure Java Tomcat

Rejestrowanie jest kluczowym elementem aplikacji, ale nie może spowalniać rzeczywistej pracy. Rozważyłem wiele opcji i jestem ciekaw najlepszej praktyki, najlepszego rozwiązania, biorąc pod uwagę bezpieczeństwo, spójność logów i wydajność zarówno w czasie przechowywania, jak i późniejszym przetwarzaniu. Oto lista opcji:

  • Używanie log4j z niestandardowym Appender do przechowywania informacji w usłudze Azure SQL.
  • Użycie log4j z niestandardowym Appender do przechowywania informacji w pamięci podręcznej Azure Tables.
  • Pisanie dodatkowego narzędzia, które przenosi dane z lokalnego dysku twardego do jednego z powyższych trwałych magazynów.

Czy jest jakaś inna metoda lub są jakieś kompletne rozwiązania tego problemu dla Javy? Które z powyższych byłoby najlepiej biorąc pod uwagę wyżej wymienione kryteria?

Odpowiedz

1

Ostatecznie zdecydowałem się napisać Log4J Appender. Nie musiałem zbierać informacji diagnostycznych, moim głównym celem było jedynie zbieranie plików dziennika w łatwy sposób wymienny. Po raz pierwszy obawiałem się, że spowolni to działanie aplikacji, ale dzięki zapisywaniu tylko w pamięci i tylko okresowemu zapisywaniu danych dziennika w tabelach Azure działa on idealnie bez wykonywania zbyt wielu wywołań API.

Oto główne etapy mojego realizacji:

Najpierw stworzyłem klasę jednostki mają być przechowywane w Azure Tables, zwany LogEntity który rozciąga com.microsoft.windowsazure.services.table.client.TableServiceEntity.

Następnie napisałem aplikację dodającą rozszerzenie org.apache.log4j.AppenderSkeleton zawierającą java.util.List<LogEntity>.

Z metody nadpisanej protected void append(LoggingEvent event) Dodałem tylko do tej kolekcji, a następnie utworzyłem wątek, który okresowo opróżnia tę listę i zapisuje dane w tabelach Azure.

Wreszcie dodałem nowo utworzony Appender do mojego pliku konfiguracyjnego log4j.

2

W tej chwili nie ma gotowego rozwiązania, ale ... niestandardowy aplikator do przechowywania tabel ma sens, ponieważ można następnie przesyłać zapytania do dzienników w sposób podobny do diagnostyki (liczniki perf itp.) .

Jedynym powodem do rozważenia jest pisanie instrukcji dziennika w ogromnej ilości (np. Setki razy na sekundę). W takim tempie zaczniesz zauważać koszty transakcji wyświetlane na rachunku miesięcznym. Przy pensie za 10 000 i 100 za sekundę, szukasz około 250 $ na instancję. Jeśli masz wiele instancji, koszt rośnie z tego miejsca. W przypadku usługi SQL Azure nie ma żadnych kosztów transakcji, ale koszty magazynowania są wyższe.

Jeśli chcesz skorzystać z metody przenoszenia danych, możesz skonfigurować diagnostykę systemu Windows Azure, aby oglądać katalog i okresowo przesyłać pliki do pamięci BLOB. Jedynym przeszkodą jest to, że Java nie ma bezpośredniego wsparcia dla konfiguracji diagnostyki. Jeśli budujesz swój projekt z Eclipse, masz tylko plik skryptu, który uruchamia wszystko, więc musisz napisać małą aplikację .net lub użyć czegoś takiego jak AzureRunMe. Jeśli tworzysz projekt Visual Studio, aby uruchomić aplikację Java, możesz skonfigurować diagnostykę bez osobnej aplikacji.

Istnieje blog post z trwałych systemów, które właśnie zostały opublikowane, dotyczące konfiguracji Java i diagnostyki. Zaktualizuję tę odpowiedź za pomocą linku po opublikowaniu na żywo . Zobacz także Cloud Ninja for Java, która implementuje rejestrowanie Tomcat (i powiązane przetwarzanie) za pomocą zewnętrznego .net exe, który konfiguruje diagnostykę, jak opisano w nadchodzącym poście.

+0

Zmieniano wyjaśnienia konieczności oddzielny .aplikacja sieciowa tylko podczas budowania aplikacji z projektów Eclipse, które nie mają kodu .net rusztowania (za @ Avkash odniesienie do WorkerRole.cs). –

+0

Nadal nie mogę się doczekać, aby przeczytać post na blogu! – hpityu

+0

Wystarczy edytować link, aby dołączyć. Występują błędy formatowania, ale są one naprawiane przez Persistent w tym tygodniu. –

1

Odwiedź mój blog i pobierz dokument. W tym dokumencie możesz znaleźć rozdział "Tomcat Solution Diagnostics" dla rozwiązania do rejestrowania błędów. Ten dokument został napisany od dawna, ale na pewno możesz użyć tej metody do wygenerowania dowolnego logarytmu Java (log4j, pewnie) w Tomcat i widoku bezpośrednio.

Rozdział 6: Tomcat Rozwiązanie Diagnostyka

  • Error Logging
  • Przeglądanie plików dziennika

http://blogs.msdn.com/b/avkashchauhan/archive/2010/10/29/windows-azure-tomcat-solution-accelerator-full-solution-document.aspx

W każdym scenariuszu, gdzie istnieje zwyczaj aplikacja tj java.exe, php. exe, python itp., proponuję utworzyć plik dziennika bezpośrednio w folderze "Local Storage", a następnie zainicjować Azure Diagnostics w roli Worker (W orkerRole.cs), aby wyeksportować te niestandardowe pliki dziennika bezpośrednio z platformy Azure VM do magazynu Azure Blob.

Jak tworzyć własne dzienniki lokalne przechowywanie opisano here.

Korzystanie Azure Diagnostics i wysyłanie logów do Azure blob byłby najtańszy i wytrzymałe następnie każda inna metoda u opisali.

+0

W przypadku wdrażania z projektów Eclipse nie ma pliku WorkerRole.cs. Tylko skrypt startowy. –

+1

Co można zrobić, to stworzyć narzędzie diagnostics.wadcfg i skonfigurować ustawienia timerów i diag oraz upuścić folder Role Root. Po uruchomieniu roli Azure będzie szukać pliku diagnostics.wadcfg w folderze głównym, w którym załaduje konfigurację i uruchomi diagnostykę. – AvkashChauhan

+1

Oto link do korzystania z "Plik konfiguracyjny Windows Azure Diagnostics" -> http://msdn.microsoft.com/en-us/library/gg604918.aspx – AvkashChauhan

0

Kolejna alternatywa;

Czy nie możemy kontynuować używania log4j w standardowy sposób (np. DailyRollingFileAppender), tylko plik powinien zostać utworzony na ścieżce UNC, na VM (IaaS). Ta maszyna wirtualna potrzebuje tylko trochę miejsca na dysku, ale nie musi mieć dużej mocy obliczeniowej. Tak więc można dzielić dostępną maszynę wirtualną lub utworzyć maszynę wirtualną o minimalnej konfiguracji, najlepiej w tym samym regionie i w usłudze chmurowej.

skumulowana plików dziennika można uzyskać za pośrednictwem RDP/FTP itd

W ten sposób nie będzie ponosić koszty transakcji i koszt opracowania specjalnego Log4j appender ... mogłoby się okazać, jako tańszą alternatywę.

dzięki Jeevan

PS: Mam na myśli bardziej ku, jedynek rejestrowanie aplikacji, a nie do logów serwera (app-Catalina/menedżer plików .log lub .out WebLogic)

Powiązane problemy