2009-08-05 15 views
18

Chciałbym wprowadzić ramy logowania do naszej istniejącej aplikacji Oracle, aby zastąpić użycie DBMS_OUTPUT.Rejestrowanie PL/SQL - jak kontrolować?

Ramy będą używane przede wszystkim do wspomagania debugowania i będą wyszczególniać takie rzeczy jak procedura startowa x, szczegóły parametrów, procedura zakończenia x itd. Powinna ona również mieć włączoną funkcjonalność dla wszystkich lub tylko jednej jednostki programowej, różne poziomy śladu w rzeczywistości to, co jest praktycznie standardową funkcją rejestrowania.

Wdrażanie tych wymagań powinno być stosunkowo proste, jednak tam, gdzie chciałbym uzyskać pomoc, najlepiej wyłączyć tę funkcję. To, co próbuję osiągnąć, to najmniejsze możliwe działanie, gdy śledzenie jest wyłączone. Który z nadzieją powinien być przez większość czasu!

Ponieważ aplikacja używa wersji 10g 2, początkowo spodobał mi się wygląd zawijania mechanizmu rejestrowania wewnątrz kompilacji warunkowej, aby struktura logowania nie była widoczna podczas normalnej pracy. Niestety, musiałem niechętnie zrezygnować z tego pomysłu, ponieważ większość aplikacji jest zbudowana przy użyciu funkcji "stand-a-samot" procedur &, więc włączenie funkcji rejestrowania może potencjalnie unieważnić wiele kodu.

miałem wyglądać kilka istniejących ram opensource i nawzajem \ funkcjonalność inspiracji:

log4plsql (http://log4plsql.sourceforge.net/)

APC opinię here zwłaszcza pod dopuszczalnego oddziaływania daje mi obawy.

projektu OraLog (http://oralog.sourceforge.net)

żadne aktualizacje od 2007

PL/VISION (here)

wygląda dość stary, nie ma zmian od Oracle 8i?

Zapytaj Tom Instrumentation (here)

Aktualizacja 01/04/2014 Tom Kyte zaleca teraz Tyler Muth na Logger

Byłbym bardzo zainteresowany, aby usłyszeć swoje doświadczenia jeśli wprowadziły jakąś formę logowania do Twojej aplikacji Oracle, jak ją wdrożyłeś, a zwłaszcza w jaki sposób ją kontrolujesz.

+1

Ask Tom Link instrumention jest uszkodzony, czy możesz to naprawić? – Sathya

+0

Cześć Sathya, dzięki za wskazanie, że na zewnątrz - powinno być teraz ok. –

+0

Dzięki, ta prezentacja była interesująca. – Sathya

Odpowiedz

5

Wspomniał Pan o odrzuceniu idei kompilacji warunkowej z powodu potencjalnych kaskadowych unieważnień - istnieje podejście podobne do tego, jeśli chcecie dotknąć źródła PL/SQL, w którym potrzebne jest rejestrowanie/śledzenie, które nie wymaga rekompilacji umożliwić.

Nadal można dodać własną parę nazw/wartości do PLSQL_CCFLAGS, a kod aplikacji powinien wykonać stosunkowo lekkie zapytanie o parametr v $, aby określić, czy rejestracja jest "włączona". Najbardziej prymitywna implementacja byłaby jedną parą nazwa/wartość, ale można by ją rozszerzyć o różne pary, które byłyby specyficzne dla modułu, aby można było włączyć rejestrowanie z lepszą szczegółowością.

[Edytuj] Oto bardzo prosty przykład w odpowiedzi na twój komentarz/prośbę - będziesz oczywiście chciał być bardziej wyrafinowany w analizie łańcucha PLSQL_CCFLAGS w przypadku, gdy ma inne istniejące informacje, być może owinięte w funkcję, itp. .:

create or replace procedure ianc_cc 
is 
cc_flag_val varchar2(4000); 
begin 
-- need direct select grant on v_$parameter for this... 
select value into cc_flag_val 
    from v$parameter where name = 'plsql_ccflags'; 
if (cc_flag_val = 'custom_logging:true') then 
    dbms_output.put_line('custom logging is on'); 
else 
    dbms_output.put_line('custom logging is off'); 
end if; 
end; 
/

teraz, gdy użytkownik uprzywilejowany do wydawania instrukcji ALTER System:

ALTER SYSTEM PLSQL_CCFLAGS set = 'custom_logging: true';

i przełączać przez:

SYSTEM ALTER ustawione PLSQL_CCFLAGS = '';

+0

+1 Dziękuję za odpowiedź - czy jest jakaś szansa na małe demo, aby zilustrować swój pomysł? Staram się zobaczyć, jak mogę uniknąć problemu rekompilacji. Oto procedura, z którą pracowałem (musiałem "spłaszczyć" ją z powodów kosmicznych: UTWÓRZ LUB WYMIENĘ PROCEDURĘ IANC_CC JEST POCZĄTKOWO $ JEŚLI $$ debug $ THEN DBMS_OUTPUT.PUT_LINE ("kod cc jest na miejscu"); $ END DBMS_OUTPUT.PUT_LINE ("normalne wykonanie"); END; - Włącz flagi plsql na alter procedure ianc_cc compile plsql_ccflags = 'debug: true' reuse settings; Dzięki Ian –

+0

Dzięki za poświęcenie czasu na przedstawienie przykładu, wznowiłbym reakcję jeszcze bardziej, gdybym mógł! Jeszcze raz dziękuję –

3

W naszej aplikacji intensywnie wykorzystujemy oprzyrządowanie debug.f. Jedną rzeczą, którą szybko zauważyłem, było to, że "debugtab" był zbyt często sprawdzany, aby sprawdzić, czy logowanie jest włączone, czy nie dla każdego pojedynczego logu. Zrobiłem na niej zmianę, żeby sprawdzać tabelę tylko raz na 100 wiadomości, a teraz działa całkiem nieźle.

Moim celem jest próba uniknięcia sprawdzania tabeli dla każdego komunikatu dziennika, aby sprawdzić, czy powinien on być wyprowadzany, czy nie. Często chcesz włączyć logowanie w trakcie długiego procesu, więc ważne jest, aby to zrobić. W moim przypadku zdecydowałem, że mogę żyć z odczekaniem kilku sekund, zanim 100 zgłoszeń rejestracyjnych minęło, zanim zauważyło, że logowanie zostało włączone.

+0

+1 Dziękuję Stephenowi, szczególnie za informację zwrotną dotyczącą rzeczywistego wykorzystania oprzyrządowania TK oraz wskazówkę na temat jego dostosowania. –

+0

Hey @StephenODonnell można wskazać bazę danych, aby wykonać buforowanie funkcji, które może buforować wynik, dopóki tabela debugtab nie unieważni pamięci podręcznej. –

+0

@AndrewRussell - to może być całkiem niezły pomysł, nie próbowałem tego z powrotem, kiedy użyłem tego narzędzia (co było już dawno temu), ale spróbuję następnym razem. –

1

Czy nie byłoby łatwiej ustawić kontekst i dodać do niego parę wartości nazwy? Możesz zmienić wartość w kontekście za pomocą wyzwalacza na tabeli debugtab.