2010-11-19 28 views
5

Ho provato l'esempio dei pantheios per accedere a un file ma non riesco a farlo funzionare. I messaggi vengono visualizzati correttamente nella console ma il file di registro non viene creato. Ho provato a cambiare i livelli di gravità da quando ho visto che thread, ma nessuno funziona.Come accedere con pantheios a un file?

Ecco il codice:

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

Ho un file "include_pantheios.cpp" a scopo di collegamento implicito. Eccolo:

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

Qualcuno vede da dove viene il mio problema? Grazie in anticipo,

Vincent

risposta

0

Per quanto posso dire di questo codice è identico al file di magazzino back-end del campione indicata con la libreria, in modo che dovrebbe funzionare.

Come si determina che i file di registro non vengono scritti? Questi sono percorsi relativi: prova a utilizzare percorsi assoluti per essere sicuro di cercare nel posto giusto.

Se tutto il resto fallisce, è possibile eseguire il debug attraverso il codice (dopo aver impostato il percorso file) per scoprire perché non viene scritto nulla.

+1

Vincent: non si chiama la funzione di inizializzazione del back-end: operazione eseguita dal runtime Pantheios. Quando si esegue il collegamento a Be.file, sia esplicito che implicito, le funzioni init/uninit vengono chiamate automaticamente.Con la maggior parte dei back-end, non puoi mai chiamare una funzione di back-end. Solo nel caso di be.file lo fai, per impostare il percorso del file di registro. – dcw

4

Penso che parte della tua confusione derivi dall'esempio che fa troppo: mostra file locali e remoti tutto in uno. Un esempio più semplice sarebbe:

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

Il problema con il codice originale, che credo proviene da un programma di esempio Pantheios, è che si sta cercando di illustraet come utilizzare locali e remoti back-end allo stesso tempo come cercando di illustrare come utilizzare il backend be.file.

Dimentica tutti i diversi back-end e concentrati sulle cose specifiche di be.file.

HTH

+1

Ho provato il tuo esempio ma il risultato è lo stesso. Posso vedere il registro nella console ma il file di registro non viene mai creato. Quando ho eseguito il debug, ho trovato che l'init non è mai stato chiamato. Sono riuscito a creare il file di registro ea scrivere in esso chiamando le funzioni 'pantheios_be_file_init' e' pantheios_be_file_logEntry'. Ma come hai detto tu, queste funzioni non dovrebbero essere chiamate implicitamente ... – Vincent

+0

Al contrario questo esempio ha funzionato per me. Ho dovuto eliminare tutto il codice che avevo usato per usare questo esempio per far sì che i file di registro iniziassero a essere prodotti. Per me ho dovuto chiamare Init anche se stavo lavorando in C++. Ecco un link al mio post se sei curioso: http://stackoverflow.com/questions/20998306/pantheios-write-to-extenal-file/21022228#21022228 – Katianie

2

Credo che il problema è l'ordine in cui si collega, ma non ho ben vedere come sia possibile dato il codice che avete inviato.

Ho riscontrato lo stesso problema e ho capito che era perché stavo collegando due backend contemporaneamente: file e fprintf. Più specificamente, era perché stavo collegando fprintf prima del file. Quando ho commutato l'ordine per collegare il file per primo, creerebbe e utilizzerò il file di registro, ma lo non sarà in uscita su stdout quando ho commentato pantheios_be_file_setFilePath. Quindi, apparentemente, il primo che è collegato è l'unico che funzionerà (cercare più backend).

3

ho avuto lo stesso problema, per la gente del futuro, il problema è la fine di collegare le librerie

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

Ho appena collego il pantheios.1.be.file.gcc44 prima della pantheios.1.be.fprintf.gcc44

+0

+1 questo ha funzionato alla grande per me - lo vedo in '/var/log/syslog' e in 'stderr' ora, ho bisogno di scrivere in'/var/log/myapp/error.log' - Mi chiedo se ho bisogno del mio backend (vorrei evitare, se possibile) ... – kfmfe04

Problemi correlati