您好有Stackoverflow黑客!
我有一个很小的严重问题,或者我和C syslog()函数之间的误解。
代码编译得很好,我可以看到它做了“虚假的工作”(pinging 8.8.8.8),但是定义的日志不会追加。 我完全被这个困惑,不知道什么是错的。 已经SMAO(search我的屁股 – 试图普及),但不能得到它正常工作。
代码在这里:
#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
解决scheme:
在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:序列的日志消息将被redirect到management.log文件。 奇迹般有效。 再次感谢您指引我正确的方向。
openlog()的第一个参数是程序标识符,而不是日志文件名。 这就解释了为什么你在/var/log/management.log
找不到任何东西。
日志文件的名称通常在logger守护进程的配置文件中设置。 该文件的名称和位置取决于您正在使用的守护进程(例如,它是我机器上的/etc/syslog-ng/syslog-ng.conf
)。