2009-08-05 11 views
18

Estoy buscando introducir un marco de trabajo de registro en nuestra aplicación Oracle existente para reemplazar el uso de DBMS_OUTPUT.Registro PL/SQL - ¿Cómo controlar?

El marco se usará principalmente para ayudar en la depuración y detallará cosas tales como iniciar el procedimiento x, detalles de parámetros, procedimiento final x etc. También debe tener la funcionalidad activada para todas o solo una unidad de programa, varios niveles de seguimiento, de hecho, lo que es bastante funcionalidad de registro estándar.

La implementación de estos requisitos debe ser relativamente sencilla, sin embargo, me gustaría que tu ayuda sea la mejor manera de activar y desactivar esta funcionalidad. Lo que intento lograr es el rendimiento más pequeño posible cuando se apaga el seguimiento. ¡Que espero que sea la mayor parte del tiempo!

Como la aplicación está utilizando la versión 2 de 10g, inicialmente me gustó el aspecto de ajustar el mecanismo de registro dentro de la compilación condicional para que el marco de registro no sea visible durante el funcionamiento normal. Desafortunadamente, he tenido que abandonar a regañadientes esta idea ya que la mayoría de las aplicaciones están compiladas usando funciones de procedimientos autónomos &, por lo que activar una funcionalidad de registro podría invalidar una gran cantidad de código.

he tenido una mirada de código abierto existentes y varios marcos de otros \ funcionalidad para la inspiración:

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

opinión de APC here especialmente bajo impacto aceptable me da problemas.

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

No hay actualizaciones desde 2007

PL/VISION (here)

parece bastante antiguo, no hay cambios desde Oracle 8i?

Pregunta a Tom Instrumentación (here)

actualización 01/04/2014 Tom Kyte recomienda ahora de Tyler Muth Logger

estaría muy interesado en escuchar sus experiencias si se ha introducido alguna forma de iniciar sesión en su aplicación Oracle, cómo la implementó y especialmente cómo la controla.

+1

Pregunta a Tom enlace instrumention se rompe, puede usted por favor solucionarlo? – Sathya

+0

Hola Sathya, gracias por señalar eso, debería estar bien ahora. –

+0

Gracias, esa presentación fue interesante. – Sathya

Respuesta

5

Mencionaste descartando la idea de la compilación condicional debido a posibles invalidaciones en cascada: hay un enfoque que es algo similar si estás dispuesto a tocar el origen PL/SQL donde es necesario el registro/seguimiento que no implica recompilación para permitir.

Aún puede agregar un par de nombre/valor de su elección a PLSQL_CCFLAGS y hacer que su código de aplicación haga una consulta relativamente liviana del parámetro v $ para determinar si el registro está "activado". La implementación más cruda sería un par de nombre/valor, pero podría extender esto para tener pares diferentes que serían específicos del módulo para que el registro pueda activarse con una granularidad más fina.

[Editar] Aquí hay un ejemplo muy sencillo, en respuesta a su comentario/pedido - Obviamente va a querer ser más sofisticados en analizar la cadena PLSQL_CCFLAGS en caso de que tenga otra información existente, tal vez envolver en una función, etc. .:

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; 
/

Ahora, como usuario privilegiado para emitir ALTER SYSTEM:

ALTER conjunto SISTEMA PLSQL_CCFLAGS = 'custom_logging: true';

y alternar por:

ALTER SYSTEM conjunto PLSQL_CCFLAGS = '';

+0

+1 Gracias por la respuesta, ¿hay alguna posibilidad de que una pequeña demostración pueda ilustrar su idea? Estoy luchando para ver cómo puedo evitar el problema de la recompilación. Este es el procedimiento con el que he estado trabajando (tuve que "aplanarlo" por razones de espacio: CREAR O REEMPLAZAR EL PROCEDIMIENTO IANC_CC ES INICIAR $ IF $$ depurar $ THEN DBMS_OUTPUT.PUT_LINE ('código de cc está en su lugar'); $ END DBMS_OUTPUT.PUT_LINE ('ejecución normal'); END; - Gire los indicadores plsql en alter procedure ianc_cc compile plsql_ccflags = 'depuración: true' reutiliza la configuración; Gracias Ian –

+0

Gracias por tomarse el tiempo para dar un ejemplo, hubiera votado la respuesta aún más si hubiera podido. Gracias de nuevo –

3

En nuestra aplicación, hacemos un uso intensivo de la instrumentación de debug.f de Ask Tom. Una cosa que noté rápidamente fue que el 'debugtab' estaba siendo consultado demasiado para ver si el registro estaba activado o no para cada mensaje de registro. Hice un cambio para ver solo la tabla una vez cada 100 mensajes de registro y ahora funciona bastante bien.

Mi objetivo es tratar de evitar consultar una tabla para cada mensaje de registro para ver si se debe generar o no. A menudo, desea iniciar sesión en medio de un proceso prolongado, por lo que es importante que pueda hacerlo. En mi caso, decidí que podía vivir esperando unos segundos hasta que hubieran pasado 100 llamadas de registro antes de que realmente notara que el registro estaba activado.

+0

+1 Gracias Stephen, especialmente por los comentarios sobre el uso real de la instrumentación TK, así como la sugerencia para personalizarlo. –

+0

Oye @StephenODonnell, puede indicar la base de datos para hacer el almacenamiento en memoria caché de funciones, que puede almacenar en caché el resultado hasta que la tabla de depuración invalide la caché. –

+0

@AndrewRussell - esa podría ser una muy buena idea, no lo intenté cuando utilicé esta herramienta (que fue hace un tiempo), pero la probaré la próxima vez. –

1

¿No sería más fácil configurar un contexto y agregarle un par de valores de nombre? Puede cambiar el valor en el contexto usando un desencadenador en su tabla debugtab.

Cuestiones relacionadas