2011-04-25 20 views
7

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.

Trả lời

5

Đối số đầu tiên cho openlog() là số nhận dạng chương trình, không phải là tên tệp nhật ký. Điều đó giải thích tại sao bạn sẽ không tìm thấy bất kỳ điều gì trong số /var/log/management.log.

Tên của tệp nhật ký thường được đặt trong tệp cấu hình của trình ghi nhật ký. Tên và vị trí của tệp đó phụ thuộc vào daemon bạn đang sử dụng (ví dụ: /etc/syslog-ng/syslog-ng.conf trên máy của tôi).

+0

Cảm ơn những người đứng đầu, hãy thử. –

+0

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. –

+0

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. –

Các vấn đề liên quan