2010-11-19 16 views
5

Próbowałem exemple z pantheios, aby zalogować się do pliku, ale nie uda się go uruchomić. Wiadomości są poprawnie wyświetlane w konsoli, ale plik dziennika nie jest tworzony. Próbowałem zmienić poziomy ważności, ponieważ zobaczyłem, że thread, ale nikt nie działa.Jak zalogować się z plikiem pantheios do pliku?

Oto kod:

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

mam "include_pantheios.cpp" plik dla celów niejawnego łącza. Oto ona:

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

Czy ktoś widzi skąd się bierze mój problem? to powinien pracować góry dzięki,

Vincent

Odpowiedz

0

O ile mogę powiedzieć, ten kod jest identyczny z próbką plik stock back-end z danej biblioteki, tzw.

W jaki sposób określasz, że pliki dziennika nie są zapisywane? Są to ścieżki względne - spróbuj użyć bezwzględnych ścieżek, aby upewnić się, że szukasz w odpowiednim miejscu.

Jeśli wszystko inne zawiedzie, można debugować kod (po ustawieniu ścieżki pliku), aby dowiedzieć się, dlaczego nic nie jest wypisywane.

+1

Vincent: nie wywołujesz funkcji inicjującej back-end: jest to robione przez środowisko wykonawcze Pantheios. Kiedy łączysz się z plikiem be.file, jawnym lub niejawnym, funkcje init/uninit są wywoływane automatycznie.W przypadku większości back-endów, nawet nie wywołujesz funkcji backendu. Tylko w przypadku pliku be. Można to zrobić, aby ustawić ścieżkę pliku dziennika. – dcw

4

Myślę, że część zamieszania wynika z tego, że przykład robi zbyt wiele: pokazuje pliki lokalne i zdalne w jednym. Prostsza Przykładem może być:

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

Problem z oryginalnego kodu, które myślę, że pochodzi z programu przykład Pantheios, jest to, że próbuje illustraet jak korzystać z lokalnych i zdalnych back-kończy się w tym samym czasie, co próbuje wyobrazić sobie, jak korzystać z zaplecza be.file.

Zapomnij o różnych wersjach back-end i skoncentruj się na materiałach związanych z plikiem be.file.

HTH

+1

Próbowałem twój przykład, ale wynik jest taki sam. Widzę dziennik w konsoli, ale plik dziennika nigdy nie jest tworzony. Kiedy debugowałem, stwierdziłem, że init nigdy nie został wywołany. Udało mi się stworzyć plik dziennika i napisać do niego, wywołując funkcje 'pantheios_be_file_init' i' pantheios_be_file_logEntry'. Ale jak powiedziałeś, te funkcje nie powinny być domyślnie nazywane ... – Vincent

+0

W przeciwieństwie do tego przykład ten pracował dla mnie. Musiałem usunąć cały kod, który miałem dosłownie po prostu użyć tego przykładu, aby zacząć tworzyć pliki dziennika. Dla mnie musiałem wywoływać Init nawet wtedy, gdy pracowałem w C++. Oto link do mojego postu, jeśli twój ciekawy: http://stackoverflow.com/questions/20998306/pantheios-write-to-extenal-file/21022228#21022228 – Katianie

2

Myślę, że problem jest kolejność, w której odwołuje się, ale nie bardzo rozumiem, jak to możliwe, biorąc pod uwagę kod, który napisali.

Napotkałem ten sam problem i zdałem sobie sprawę, że to dlatego, że łączyłem dwa backendy naraz: file i fprintf. Dokładniej, to dlatego, że łączyłem fprintf przed plikiem. Kiedy najpierw zamieniłem zamówienie na plik łączący, wtedy utworzyłoby się i użyłoby pliku dziennika, ale byłoby nie wyjście do stdout, gdy skomentowałem pantheios_be_file_setFilePath. Więc najwyraźniej to, co jest połączone, jest jedynym, które będzie działało (sprawdzanie wielu backendów).

3

Mam ten sam problem, dla przyszłych ludzi, problemem jest to, aby łączyć bibliotek

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

po prostu połączyć pantheios.1.be.file.gcc44 przed pantheios.1.be.fprintf.gcc44

+0

+1 to działało świetnie dla mnie - widzę to w/var/log/syslog' i 'stderr' teraz, muszę napisać do'/var/log/myapp/error.log' - Zastanawiam się, czy potrzebuję własnego zaplecza (chciałbym tego uniknąć, jeśli to możliwe) ... – kfmfe04

Powiązane problemy