2009-11-13 16 views
8

Mam kilka procesów uruchomionych jednocześnie, które chcę zalogować do tego samego pliku.Rejestrowanie z wielu procesów do tego samego pliku przy użyciu biblioteki Enterprise 4.1

Korzystaliśmy z bloku aplikacji do rejestrowania w bibliotece Enterprise 4.1 (z RollingFlatFileTraceListener) i działa dobrze, poza tym, że dodaje GUID do nazwy pliku logu, gdy dwa procesy próbują zapisać do pliku dziennika na w tym samym czasie (przypuszczam, że jest to dziwactwo z System.Diagnostics.TextWriterTraceListener).

Próbowałem różnych rzeczy, w tym wywoływania Logger.Writer.Dispose() po zapisaniu do pliku dziennika, ale nie jest idealne, aby wykonać wywołanie blokujące za każdym razem, gdy wpis dziennika jest zapisywany.

Fora EntLib sugerują używanie MSMQ z usługą Dystrybutora, ale nie jest to możliwe, ponieważ MSMQ nie jest dozwolone w mojej firmie.

Czy istnieje inny sposób, w jaki mogę szybko i łatwo zalogować się z wielu wątków/procesów do tego samego pliku?

+0

czy otrzymałeś alternatywne rozwiązanie? może używając *** MSMQ ***? – Kiquenet

+0

@Kiquenet to był taki długi czas, nie pamiętam. Jeśli próbuję naprawdę mocno, niewyraźnie pamiętam, że w końcu użyliśmy różnych plików dziennika dla różnych procesów, aby obejść ten problem. Nie jest idealny, ale chcieliśmy zachować prostotę. – Riko

+0

Mogę dodać, gdybym musiał teraz wybrać framework do logowania, chciałbym pozostać jak najdalej od Biblioteki Enterprise. Jest zbyt skomplikowany, zarówno do używania, jak i konfiguracji, i nie jest łatwy do rozszerzenia. Prawdopodobnie pójdę z [log4net] (https://logging.apache.org/log4net/) lub [NLog] (http://nlog-project.org/). – Riko

Odpowiedz

4

Przykro mi to mówić, ale odpowiedź brzmi: nie. Plik TraceListeners blokuje plik wyjściowy, aby tylko jeden TraceListener mógł logować się do pliku.

Możesz wypróbować inne moduły nasłuchiwania śledzenia, które nie są oparte na plikach (na przykład baza danych, dziennik zdarzeń).

Inną opcją, o której myślę, byłoby napisanie własnej usługi rejestrowania (poza procesem), która rejestrowałaby się w pliku i akceptuje LogEntries. Następnie utwórz niestandardowy detektor śledzenia, który wyśle ​​wiadomość do Twojej usługi.

To może nie być dobry pomysł, ponieważ będziesz miał trochę niestandardowego rozwoju i może to wpłynąć na wydajność, ponieważ jest poza procesem. Zasadniczo konfigurujesz własną usługę uproszczonego pseudo-dystrybutora.

+0

Jest to ten sam wniosek, do którego również doszliśmy. W dłuższej perspektywie prawdopodobnie zostanie napisana prosta logiczna usługa typu "wrzuć i zapomnij" do logowania, wydaje się, że jest to jedyna możliwa do zastosowania opcja. Szkoda jednak. – Riko

2

EntLib blokuje plik dziennika, gdy go zapisuje. Dlatego 2 procesy nie mogą zapisywać do tego samego pliku dziennika.

Kiedy mieliśmy ten problem, że musieliśmy zalogować się z wielu różnych miejsc, w tym samym miejscu, używaliśmy rejestrowania bazy danych.

Jeśli w 100% utkniesz podczas logowania do pliku tekstowego, możesz zalogować się do poszczególnych plików dziennika, a następnie napisać program scalający te pliki.

+0

Nawet 2 oddzielne śledzące śledzenie w tym samym procesie nie może zalogować się do tego samego pliku. –

+0

Tak, rejestrowanie bazy danych nie jest dla nas opcją, nie mamy takiego.W tej chwili rzeczywiście używamy indywidualnych plików dziennika, które łączymy. Ale to będzie tylko krótkoterminowe obejście. – Riko

1

Wiem, że to jest stare, ale jeśli nadal jesteś ciekawy. log4net obsługuje to:

http://logging.apache.org/log4net/release/faq.html#How do I get multiple process to log to the same file?
+1

Dzięki. Używanie log4net w tym projekcie nie wchodziło w grę. Gdyby to była moja decyzja, zdecydowanie użyłbym go w EntLibie, jednak rejestracja EntLib jest zbyt rozdęta i trudna do zrozumienia. – Riko

0

Problem występuje, gdy pula aplikacji przetwarza i pozwala na nakładanie się wątków. Wątek zamykający nadal go otwiera, a nowy wątek otrzymuje błąd. Spróbuj wyłączyć nakładające się działanie związane z recyklingiem w usługach IIS lub utwórz własną wersję programu piszącego tekst.

Powiązane problemy