Xin chào các tin tặc Stackoverflow!C Syslog.h không viết nhật ký
Tôi có một trường hợp rất nhỏ về vấn đề nghiêm trọng hoặc sự hiểu lầm giữa tôi và hàm C syslog().
Mã biên dịch tốt và tôi có thể thấy nó thực hiện "công việc giả" (ping 8.8.8.8), nhưng nhật ký được xác định không thêm vào. Tôi hoàn toàn bối rối bởi điều này, và không có ý tưởng gì có thể sai. Đã SMAO (Đã tìm kiếm My Ass Off - cố gắng phổ biến điều đó) nhưng không thể làm cho nó hoạt động đúng cách.
Mã ở đây:
#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);
}
Tất cả các trợ giúp sẽ được đánh giá cao!
estol
Giải pháp:
gia tăng các dòng sau vào 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); };
Tất cả các thông điệp log chứa MD: trình tự, sẽ được chuyển hướng vào tệp management.log. Làm việc như một sự quyến rũ. Cảm ơn bạn lần nữa vì đã chỉ cho tôi đúng hướng.
Cảm ơn những người đứng đầu, hãy thử. –
Một trận chiến đã thắng, thông điệp tường trình giờ đây xuất hiện trong tệp everything.log. Tôi nghĩ rằng tôi có thể hình dung nó từ bây giờ, cảm ơn bạn Frédéric cho câu trả lời nhanh chóng. –
Xong, chỉ để ghi lại, tôi sẽ chỉnh sửa câu hỏi và thêm giải pháp vào cuối. –