2010-11-19 17 views
5

Probé el ejemplo de pantheios para iniciar sesión en un archivo pero no logro hacerlo funcionar. Los mensajes se muestran correctamente en la consola, pero el archivo de registro no se crea. Intenté cambiar los niveles de severidad desde que vi ese thread, pero nadie funciona.¿Cómo iniciar sesión con pantheios en un archivo?

Aquí está el código:

/* Pantheios Header Files */ 
#include <pantheios/pantheios.hpp>   // Pantheios C++ main header 
#include <pantheios/inserters/args.hpp>  // for pantheios::args 
#include <pantheios/inserters/exception.hpp> // for pantheios::exception 

#include <pantheios/backends/bec.file.h>  // be.file header 

/* Standard C/C++ Header Files */ 
#include <exception>       // for std::exception 
#include <new>        // for std::bad_alloc 
#include <string>        // for std::string 
#include <stdlib.h>       // for exit codes 

/* ////////////////////////////////////////////////////////////////////// */ 

/* Define the stock front-end process identity, so that it links when using 
* fe.N, fe.simple, etc. */ 
PANTHEIOS_EXTERN_C const PAN_CHAR_T PANTHEIOS_FE_PROCESS_IDENTITY[] = PANTHEIOS_LITERAL_STRING("example.cpp.file"); 

/* ////////////////////////////////////////////////////////////////////// */ 

#define PSTR(x)   PANTHEIOS_LITERAL_STRING(x) 

/* ////////////////////////////////////////////////////////////////////// */ 

int main(int argc, char **argv) 
{ 
    try 
    { 
#ifndef PANTHEIOS_USE_WIDE_STRINGS 
     pantheios::log_DEBUG("main(", pantheios::args(argc, argv), ")"); 
#else /* ? !PANTHEIOS_USE_WIDE_STRINGS */ 
     STLSOFT_SUPPRESS_UNUSED(argc); STLSOFT_SUPPRESS_UNUSED(argv); 
#endif /* !PANTHEIOS_USE_WIDE_STRINGS */ 

     pantheios::log_NOTICE(PSTR("stmt 1")); 

     // Set the file name for the local back-end, truncating the 
     // file's existing contents, if any. 
     pantheios_be_file_setFilePath(PSTR("log.local"),  PANTHEIOS_BE_FILE_F_TRUNCATE, PANTHEIOS_BE_FILE_F_TRUNCATE, PANTHEIOS_BEID_LOCAL); 

     pantheios::log_NOTICE(PSTR("stmt 2")); 

     // Set the file name for the remote back-end. 
     pantheios_be_file_setFilePath(PSTR("log.remote"), PANTHEIOS_BEID_REMOTE); 

     pantheios::log_NOTICE(PSTR("stmt 3")); 

     // Set the file name for all back-ends. 
     pantheios_be_file_setFilePath(PSTR("log.all")); 

    pantheios::log_NOTICE(PSTR("stmt 4")); 

    pantheios::log_DEBUG(PSTR("exiting main()")); 

    system("pause"); 
    return EXIT_SUCCESS; 
} 
catch(std::bad_alloc&) 
{ 
    pantheios::log(pantheios::alert, PSTR("out of memory")); 
} 
catch(std::exception& x) 
{ 
    pantheios::log_CRITICAL(PSTR("Exception: "), pantheios::exception(x)); 
} 
catch(...) 
{ 
    pantheios::logputs(pantheios::emergency, PSTR("Unexpected unknown error")); 
} 

return EXIT_FAILURE; 
} 

/* ///////////////////////////// end of file //////////////////////////// */ 

Tengo un archivo "include_pantheios.cpp" para el propósito vínculo implícito. Aquí está:

/* Pantheios Header Files */ 
#include <pantheios/implicit_link/core.h> 
#include <pantheios/implicit_link/fe.simple.h> 
#include <platformstl/platformstl.h> 
#include <pantheios/implicit_link/be.file.h> 

#if ( defined(UNIX) || \ 
    defined(unix))&& \ 
    ( defined(_WIN32) || \ 
    defined(_WIN64)) 
# include <unixem/implicit_link.h> 
#endif /* _WIN32 || _WIN64 */ 

¿Alguien ve de dónde viene mi problema? Gracias de antemano,

Vicente

Respuesta

0

Por lo que yo puedo decir este código es idéntico a la muestra archivo stock de back-end dado con la biblioteca, por lo que se debe trabajar.

¿Cómo determina que los archivos de registro no estén escritos? Estas son rutas relativas: intente utilizar rutas absolutas para asegurarse de que está buscando en el lugar correcto.

Si falla todo lo demás, puede depurar a través del código (una vez que se haya establecido el archivo) para averiguar por qué no se escribe nada.

+1

Vincent: no llama a la función de inicio back-end: eso es hecho por el tiempo de ejecución de Pantheios. Cuando se vincula al archivo .file, ya sea explícito o implícito, las funciones de inicio/no ingreso se invocan automáticamente.Con la mayoría de los back-ends, nunca llama a una función de backend. Solo en el caso de be.file lo hace, para establecer la ruta del archivo de registro. – dcw

4

Creo que parte de su confusión viene del ejemplo que hace demasiado: muestra archivos locales y remotos, todo en uno. Un ejemplo más sencillo sería:

// Headers for main() 
#include <pantheios/pantheios.hpp> 
#include <pantheios/backends/bec.file.h> 

// Headers for implicit linking 
#include <pantheios/implicit_link/core.h> 
#include <pantheios/implicit_link/fe.simple.h> 
#include <pantheios/implicit_link/be.file.h> 

int main() { 

    pantheios::log_NOTICE("log-1"); // save until log file set 
    pantheios_be_file_setFilePath("mylogfile"); // sets log file; write "log-1" stmt 
    pantheios::log_NOTICE("log-2"); // write "log-2" stmt 
    pantheios_be_file_setFilePath(NULL); // close "mylogfile" 


    pantheios::log_NOTICE("log-3"); // save until log file set 
    pantheios_be_file_setFilePath("mylogfile2"); // sets log file; write "log-3" stmt 
    pantheios::log_NOTICE("log-4"); // write "log-4" stmt 
} // closes "mylogfile2" during program closedown 

El problema con el código original, que creo que viene de un programa de ejemplo Pantheios, es que está tratando de illustraet cómo utilizar remotas back-ends al mismo tiempo como local y tratando de ilusionar cómo usar el archivo be.file.

Olvídese de los diferentes back-ends y concéntrese en las cosas específicas del archivo.

HTH

+1

Probé tu ejemplo, pero el resultado es el mismo. Puedo ver el registro en la consola, pero el archivo de registro nunca se crea. Cuando depuré, descubrí que nunca se llamó al init. Logré crear el archivo de registro y escribir en él llamando a las funciones 'pantheios_be_file_init' y' pantheios_be_file_logEntry'. Pero como dijiste, esas funciones no deberían llamarse implícitamente ... – Vincent

+0

En contraste, este ejemplo funcionó para mí. Tuve que eliminar todo el código. Tuve, literalmente, usar este ejemplo para que los archivos de registro comiencen a producirse. Para mí tuve que llamar a Init incluso duro, estaba trabajando en C++. Aquí hay un enlace a mi publicación si es curioso: http://stackoverflow.com/questions/20998306/pantheios-write-to-extenal-file/21022228#21022228 – Katianie

2

Creo que el problema es el orden en el que se vincula, pero no acabo de ver cómo es posible dado el código que envió.

Me encontré con el mismo problema, y ​​me di cuenta de que era porque estaba uniendo dos backends a la vez: file y fprintf. Más específicamente, fue porque estaba vinculando fprintf antes del archivo. Cuando cambié el pedido para vincular el archivo primero, entonces creaba y usaba el archivo de registro, pero no daba salida a stdout cuando comentaba pantheios_be_file_setFilePath. Entonces, aparentemente, cualquiera que esté vinculado primero es el único que funcionará (buscar múltiples backends).

3

que tiene el mismo problema, para las personas futuras, el problema es el orden para enlazar las bibliotecas

Pantheios Foro: https://sourceforge.net/projects/pantheios/forums/forum/475314/topic/5313841/index/page/1

que ponga el enlace del pantheios.1.be.file.gcc44 antes de la pantheios.1.be.fprintf.gcc44

+0

+1 esto funcionó muy bien para mí, lo veo en '/var/log/syslog' y en 'stderr' ahora, necesito escribir en'/var/log/myapp/error.log' - Me pregunto si necesito mi propio back-end (me gustaría evitar, si es posible) ... – kfmfe04

Cuestiones relacionadas