2011-04-25 14 views
7

हाय वहाँ Stackoverflow हैकर्स!सी Syslog.h लॉग लिख नहीं

मेरे पास गंभीर समस्या का मामूली मामला है, या मेरे बीच गलतफहमी है, और सी syslog() फ़ंक्शन।

कोड ठीक संकलित है, और मैं अपने अपने "डमी काम" कर (8.8.8.8 पिंग) देख सकते हैं, लेकिन परिभाषित लॉग सिर्फ संलग्न नहीं है। मैं इस से पूरी तरह से परेशान हूं, और मुझे नहीं पता कि क्या गलत हो सकता है। पहले से ही एसएमएओ (मेरी गधा बंद खोज - इसे लोकप्रिय करने की कोशिश कर रहा है) लेकिन बस इसे ठीक से काम नहीं कर सकता है। यहाँ

कोड:

#include <sys/types.h> 
#include <sys/stat.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <fcntl.h> 
#include <errno.h> 
#include <unistd.h> 
#include <syslog.h> 
#include <string.h> 

// Application settings # TODO: import these from a .ini file 

#define WORKDIR "/var/run/management" 
#define LOGDIR "/var/log/management" 
#define LOGFILE "/var/log/management.log" 
#define SCRIPTDIR "/var/spool/management" 
#define PIDFILE "/var/run/management/daemon.pid" 

int main(void) { 
    printf("Management Daemon\nInitializing..."); 
    pid_t pid, sid; 

    setlogmask(LOG_UPTO (LOG_NOTICE)); 
    openlog(LOGFILE, LOG_CONS | LOG_PID | LOG_NDELAY, LOG_LOCAL1); 
    syslog(LOG_NOTICE, "Management Daemon started by User %d", getuid()); 
    closelog(); 

    printf("Done.\nForking...\n"); 

    pid = fork(); 
    if(pid < 0) { 
    printf("Fork failed! Exiting...\n"); 
    // TODO: syslog facility 

    syslog(LOG_EMERG, "Forking failed, exiting."); 
    closelog(); 

    exit(EXIT_FAILURE); 
    } 
    if(pid > 0) { 
    FILE *pidfile; 
    pidfile = fopen(PIDFILE, "w"); 
    fprintf(pidfile, "%d\n", pid); 
    fclose(pidfile); 
    printf("PID written to %s\nUsing log file %s\nGoing silent...\n", PIDFILE, LOGFILE); 
    // TODO: syslog facility 

    openlog(LOGFILE, LOG_CONS | LOG_PID | LOG_NDELAY, LOG_LOCAL1); 
    syslog(LOG_NOTICE, "Fork returned with valid PID: %d. PID file: %s", pid, PIDFILE); 

    exit(EXIT_SUCCESS); 
    } 

    umask(0); 

    sid = setsid(); 
    if(sid < 0) { 
    // TODO: syslog facility 
    printf("SID is corrupt\n"); 
    exit(EXIT_FAILURE); 
    } 
    if(sid > 0) { 
    printf("Acquired valid SID!\n"); 
    } 
    if((chdir(WORKDIR)) < 0) { 
    // TODO: syslog facility 
    printf("Directory change failed. Got permissions?\n"); 
    exit(EXIT_FAILURE); 
    } 

    // Going Silent 
    close(STDIN_FILENO); 
    close(STDOUT_FILENO); 
    close(STDERR_FILENO); 

    // daemon init here 

    FILE *fp; 

    // The big loop 
    closelog(); 

    while(1) { 
    // Do your thing... 
    // TODO: implement daemon executing mechanics. 
    ret = system("ping 8.8.8.8 -c 1"); 
    fp = fopen("/var/run/management.output", "a"); 
    if(ret == 0) { 
     fprintf(fp, "Success!\n"); 
     fclose(fp); 
    } 
    if(ret == 512) { 
     fprintf(fp, "Failure!\n"); 
     fclose(fp); 
    } 
    // Sleep till the next heartbeat 
    // TODO: notice level log about heartbeats if verbosity is set to high 
    sleep(30); 
    } 
exit(EXIT_SUCCESS); 
} 

सभी मदद अत्यधिक सराहना की होगी!

estol


समाधान:

जोड़ा निम्नलिखित लाइनों को syslog-ng.conf:

destination d_management { file("/var/log/management/management.log"); }; 
filter f_management { match("MD:" value("MESSAGE")); }; 
log { source(src); filter(f_management); destination(d_management); }; 

सभी लॉग संदेश जो शामिल एमडी: अनुक्रम, पुनः निर्देशित किया जाएगा management.log फ़ाइल में। एक आकर्षण की तरह काम करता है। मुझे सही दिशा में इंगित करने के लिए फिर से धन्यवाद।

उत्तर

5

पहला तर्क openlog() के लिए एक कार्यक्रम पहचानकर्ता, नहीं एक लॉग फ़ाइल का नाम है। यह बताता है कि आपको /var/log/management.log में कुछ भी क्यों नहीं मिलेगा।

लॉग फ़ाइल का नाम आमतौर पर लकड़हारा डेमॉन के विन्यास फाइल में सेट है। उस फ़ाइल का नाम और स्थान उस डिमन पर निर्भर करता है जिसका आप उपयोग कर रहे हैं (उदा। यह मेरी मशीन पर /etc/syslog-ng/syslog-ng.conf है)।

+0

इसे करने की कोशिश करते हुए सिर के लिए धन्यवाद। –

+0

एक लड़ाई जीती है, लॉग संदेश अब सबकुछ में दिखाई देता है। लॉग इन करें। मुझे लगता है कि मैं इसे अब से समझ सकता हूं, त्वरित उत्तर के लिए फ्रेडेरिक धन्यवाद। –

+0

हो गया, बस रिकार्ड के लिए, मैं प्रश्न को संपादित करने और समाप्त करने के लिए समाधान जोड़ देगा। –

संबंधित मुद्दे