¿Cómo obtener avisos en la secuencia de salida?


20

Tengo mensajes de depuración en funciones. Esos mensajes se plantean como

RAISE NOTICE 'Value of id : %', id;

Configuré mi archivo de registro con \o messages.txt

Entonces hago lo que tengo que hacer con \i process.sql

Y cuando se termina la ejecución, \o.

El problema es que no tengo los mensajes generados por avisos en messages.txt. Los mensajes se muestran en la pantalla pero quiero que se escriban en messages.txt

¿Cómo podría hacer eso?

Traté de usar RAISE LOG...y los mensajes están escritos en el archivo de registro ... No es lo que quiero.

Tengo un trabajo con

plsql -f /path/to/process.sql > messages.txt 2>&1

pero me gustaría saber cómo podría usar \ i y \ o en el cliente plsql que tiene los mensajes en el archivo especificado en \ o

Mi cliente, en cygwin es psql (PostgreSQL) 8.2.11 y la versión del servidor es 9.0.7


1
Si bien no es la causa de su problema, el uso de psql 8.2 contra la página 9.0 puede causarle todo tipo de problemas debido a todos los cambios en el esquema del catálogo del sistema y las nuevas características del servidor. Si encuentra problemas extraños o inesperados, intente con psql 9.x.
Craig Ringer

@CraigRinger El problema es que el cliente psql para cygwin no está disponible. Al menos la última vez que intenté actualizar el cliente en Cygwin. No puedo usar la funcionalidad \ d, pero todo lo demás parece estar bien.
Luc M

@CraigRinger No sabía que el cliente ya no era compatible. Gracias.
Luc M

Acabo de comprobarlo dos veces; Yo pensé cygwin estaba sin apoyo y que no había oído de quien lo utiliza durante mucho tiempo, pero parece que la gente todavía están construyendo PostgreSQL 9.2 beta el Cygwin en el buildfarm ; ver brolga . Deberia de funcionar. Probablemente solo tendrá que compilar desde la fuente si desea la Pg actual, solo serán los paquetes binarios de Cygwin que no se mantengan. Eliminaré ese comentario para evitar futuras confusiones.
Craig Ringer

Sin embargo, la pregunta sigue siendo: ¿por qué usar Cygwin psql? libpqPodría entender si tiene un software no portátil que debe ejecutarse en Cygwin, pero cuando psqlestá disponible de forma nativa para Windows, ¿cuál es el atractivo de ejecutar una versión antigua en Cygwin?
Craig Ringer

Respuestas:


8

Me temo que no le gustará esta respuesta, pero actualmente parece imposible. De la documentación de psql :

Guarda los resultados de la consulta futura en el nombre del archivo o canaliza los resultados futuros en un shell de Unix separado para ejecutar el comando. Si no se especifican argumentos, la salida de la consulta se restablecerá a la salida estándar.

"Resultados de la consulta" incluye todas las tablas, respuestas de comandos y avisos obtenidos del servidor de la base de datos, así como la salida de varios comandos de barra invertida que consultan la base de datos (como \ d), pero no mensajes de error.

Y como notó, no hay forma de redirigir los mensajes de error cuando se usa de forma psqlinteractiva.

(He estado jugando con todo tipo de redireccionamiento de forma inútil. Parece que el canal de salida de la consulta es diferente del que recibe los mensajes de error, e incluso los errores del servidor y generados en sus procedimientos son diferentes .

test=# SHOW client_min_messages;
 client_min_messages
---------------------
 notice

-- added the above to show it's not a config problem

CREATE FUNCTION raise_test() RETURNS integer AS
$body$
BEGIN
    RAISE NOTICE 'notice';
    RETURN 1;
END;
$body$
LANGUAGE plpgsql;

test=# \o | cat > out.sql
test=# SELECT raise_test(); -- you could put this in a file and call \i your_file, it's just the same
NOTICE:  notice

test=# \o | cat > out.sql 2>&1
test=# SELECT raise_test();
NOTICE:  notice

out.sql contiene

 raise_test
------------
          1
(1 row)

en ambos casos. Es por eso que no tengo idea de qué canal / descriptor de archivo se utiliza para enviar los mensajes generados por un procedimiento.))

(Hay un hilo en los hackers de PostgreSQL que puede arrojar algo de luz sobre este problema: http://postgresql.1045698.n5.nabble.com/psql-output-locations-td5068313.html )

Lo que uno podría hacer es comenzar psqlcomo

psql test >/tmp/psql.out 2>&1

y esto redirigirá toda la salida al archivo especificado. El único problema con esto es que ni siquiera tiene un mensaje y pierde las capacidades de edición de la línea de comandos.


1
No, no me gusta tu respuesta. :-)
Luc M

El descriptor de canal / archivo se utiliza para enviar los mensajes generados por un procedimiento : es el error estándar. \o | cat > out.sql 2>&1redirige el error estándar de catpero no el de psql, por lo que no sirve para los avisos.
Daniel Vérité

@dezso, ¿Cómo muestra la NOTICEinformación pgAdmin o cualquier otra herramienta GUI ?
Spike

@Spike no están construidos encima psql, así que probablemente sin ningún problema.
Dezso

@dezso, sí lo entiendo. Tengo un problema similar, he puesto client_min_messagea debugdentro de mi sesión y ejecutar algunas sqls dinámicas con ( DO- sin crear ninguna función), se plantea aviso en pgAdmin al no con psql. Imprimí el client_min_messagevalor antes de ejecutar la DOdeclaración. Se muestra debug, pero el mensaje no se imprime en la consola.
Spike

2

Podemos ejecutar el comando de shell directamente desde psql usando el \!comando meta.

localhost: 5432 usuario @ db = # \! psql -U usuario -h localhost your_database -e 'seleccione su_nombre_función ()'> debug.txt 2> & 1

abrir debug.txtcon \e.

localhost: 5432 usuario @ db = # \ e debug.txt

el mensaje de subida se mostrará en su editor predeterminado. un poco complicado, aún bastante útil para el amante de la línea de comandos.


0

No es una solución a la pregunta original, sino una adición a la solución alternativa de OP (que no funcionó para mí)


Con lo siguiente como raiseTest.sql

BEGIN;

CREATE FUNCTION count_to_hundred() RETURNS VOID AS
$_$
BEGIN
    FOR i IN 1..100 
    LOOP
        RAISE NOTICE '%', i;
    END LOOP;

    RETURN;
END;
$_$
LANGUAGE plpgsql;


SELECT count_to_hundred();

ROLLBACK;



No estoy seguro de por qué no funciona la escritura de la salida en un archivo como se indica en el OP, pero realmente funcionó conectarlo en tee :

psql -f raiseTest.sql 2>&1 | tee messages.txt


Tee escribe el stdin en uno o más archivos y nuevamente en el stdout. Por lo tanto, tendrá todas las declaraciones RAISE en su consola y en los archivos que proporcionó. (cf. página de manual de tee )


Configuración:

  • Postgres 8.4
  • Cygwin 2.0.2
  • tee 8.23

La pregunta era sobre cómo recibir los mensajes NOTICEmientras estás en una sesión interactiva y usarlos\o
Luc M

Oh, estás justo ahí. Perdí totalmente esa parte, ya que la solución en el OP no funcionó para mí y me concentré solo en esto.
Father Stack
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.