2011-04-25 7 views
7

こんにちはそこにStackoverflowハッカー!C syslog.hはログを書きません

私と、syslog()関数の間に深刻な問題や誤解があったことがあります。

コードはちゃんとコンパイルされており、「ダミージョブ」(ping 8.8.8.8)が実行されていますが、定義されたログだけが追加されません。私は完全にこれに困惑し、何が間違っているか分かりません。すでにSMAO(私のお尻を探そう - それを普及させようとしている)が、それを正しく働かせることはできません。ここ

コード:

#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); }; 

をMDが含まれているすべてのログメッセージ:シーケンスは、リダイレクトされますmanagement.logファイルに追加します。 魅力的な作品です。正しい方向に向いてくれてありがとう。

答えて

5

openlog()の最初の引数はプログラム識別子であり、ログファイル名ではありません。それで/var/log/management.logに何も見つからない理由を説明します。

ログファイルの名前は、通常、ロガーデーモンの構成ファイルで設定されます。そのファイルの名前と場所は、使用しているデーモンによって異なります(例:私のマシン上では/etc/syslog-ng/syslog-ng.conf)。

+0

頭をアップしてくれてありがとう、それを試してください。 –

+0

戦闘に勝ち、ログメッセージがeverything.logに表示されるようになりました。私は今から理解できると思いますが、フレデリックには素早く答えてくれてありがとう。 –

+0

完了しました。レコードのために、私は質問を編集し、解決策を最後に追加します。 –

関連する問題