9

こんにちは、Stackoverflow ハッカーの皆さん!

私は深刻な問題、または私と C syslog() 関数の間の誤解の非常に小さなケースを持っています。

コードは問題なくコンパイルされ、「ダミー ジョブ」 (8.8.8.8 に ping を送信) を実行していることがわかりますが、定義されたログは追加されません。私はこれに完全に困惑しており、何が間違っているのかわかりません。すでに SMAO (Searched My Ass Off - それを普及させようとしている) ですが、適切に動作させることはできません。

ここにコード:

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

すべての助けをいただければ幸いです。

エストール


ソリューション:

次の行を 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 ファイルにリダイレクトされます。魅力のように機能します。私を正しい方向に向けてくれてありがとう。

4

1 に答える 1

6

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

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

于 2011-04-25T05:16:31.957 に答える