हाय वहाँ 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 फ़ाइल में। एक आकर्षण की तरह काम करता है। मुझे सही दिशा में इंगित करने के लिए फिर से धन्यवाद।
इसे करने की कोशिश करते हुए सिर के लिए धन्यवाद। –
एक लड़ाई जीती है, लॉग संदेश अब सबकुछ में दिखाई देता है। लॉग इन करें। मुझे लगता है कि मैं इसे अब से समझ सकता हूं, त्वरित उत्तर के लिए फ्रेडेरिक धन्यवाद। –
हो गया, बस रिकार्ड के लिए, मैं प्रश्न को संपादित करने और समाप्त करने के लिए समाधान जोड़ देगा। –