C Syslog.h nicht schreiben das Protokoll
Hallo Stackoverflow Hacker!
Ich habe eine sehr kleine Falle von schwerwiegenden problem oder Missverständnis zwischen mir und der C-syslog () - Funktion.
Den code kompiliert einwandfrei, und ich kann sehen, Ihr tun Ihr "dummy-Arbeit" (Ping 8.8.8.8), aber die angegebenen log einfach nicht Anhängen. Ich bin komplett verwirrt und habe keine Ahnung, was falsch sein könnte. Bereits SMAO (ich Suchte mir den Arsch Ab - zu versuchen, um zu popularisieren, dass), aber kann einfach nicht bekommen es richtig funktioniert.
Code hier:
#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);
}
Alle Hilfe wäre sehr geschätzt!
estol
Die Lösung:
Hinzugefügt die folgenden Zeilen der 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); };
Alle log-Meldungen, enthält der MD: Sequenz, werden weitergeleitet an die Geschäftsführung.log-Datei.
Funktioniert wie ein Charme. Danke nochmal für den Hinweis mich in die richtige Richtung.
- SMAO ...sehr gut, wird versuchen, es von nun an 🙂
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das erste argument openlog() ist eine Programm-id, nicht der name einer Protokolldatei. Das erklärt, warum Sie nicht finden alles in
/var/log/management.log
.Den Namen der log-Datei ist normalerweise im logger-daemon-Konfigurationsdatei. Der name und Speicherort der Datei hängt von der daemon du verwendest (es ist z.B.
/etc/syslog-ng/syslog-ng.conf
auf meinem Rechner).