zoukankan      html  css  js  c++  java
  • linux syslog 笔记

    原文地址

    Linux日记系统由系统日志监控程序syslogd和内核日志监控程序klogd组成。从它们的命名可以看到,这两个监控程序都是守护程序(daemon),且都注册成了系统服务。换句话说,我们可以在目录/etc/init.d/下找到它们对应的执行程序,并通过service命令对它们进行启动,关闭,重启等操作。/etc/syslog.conf文件是Linux日记系统的配置文件。下面是本人/etc/syslog.conf文件内容(ubuntu下为/etc/rsyslog.conf)

     
    1. # Log all kernel messages to the console.  
    2. # Logging much else clutters up the screen.  
    3. #kern.*                                                 /dev/console  
    4.  
    5. # Log anything (except mail) of level info or higher.  
    6. # Don't log private authentication messages!   
    7. *.info;mail.none;authpriv.none;cron.none                /var/log/messages  
    8.  
    9. # The authpriv file has restricted access.   
    10. authpriv.*                                              /var/log/secure  
    11.  
    12. # Log all the mail messages in one place.   
    13. mail.*                                                  -/var/log/maillog  
    14.  
    15.  
    16. # Log cron stuff   
    17. cron.*                                                  /var/log/cron  
    18.  
    19. # Everybody gets emergency messages   
    20. *.emerg                                                 *  
    21.  
    22. # Save news errors of level crit and higher in a special file.   
    23. uucp,news.crit                                          /var/log/spooler  
    24.  
    25. # Save boot messages also to boot.log   
    26. local7.*                                                /var/log/boot.log  

    在对这个配置文件进行详细的解释之前,我们先看一下在Linux C编程中如何利用syslog进行日记。

    syslog APIs

    Linux C中提供一套系统日记写入接口,包括三个函数:openlog,syslog和closelog。

    调用openlog是可选择的。如果不调用openlog,则在第一次调用syslog时,自动调用openlog。调用closelog也是可选择的,它只是关闭被用于与syslog守护进程通信的描述符。

    下面是这三个函数的调用格式:

    其中openlog和closelog都是可选的。不过,通过调用openlog,我们www.linuxidc.com可以指定ident参数。这样,ident将被加到每条日记记录中。ident一般设成程序的名字,如在下面例子中的"testsyslog":

    1. #include <syslog.h>   
    2.   
    3. int main(int argc, char *argv[])   
    4. {   
    5.     openlog("testsyslog", LOG_CONS | LOG_PID, 0);   
    6.     syslog(LOG_USER | LOG_INFO, "syslog test message generated in program %s \n", argv[0]);   
    7.     closelog();   
    8.     return 0;   
    9. }  

    编译生成可执行文件后,每运行一次,程序将往/var/log/messages添加一条如下的记录:

    1. Apr 23 17:15:15 lirong-920181 testsyslog[27214]: syslog test message generated in program ./a.out  

    格式基本是:timestamp hostname ident[pid]:log message。其中ident就是我们调用openlog是指定的"testsyslog",而之所以会打印出[27214]是openlog的option参数中指定了LOG_PID。下面我们详细讨论openlog函数中的option,facility和syslog函数中的priority参数。

    根据/usr/include/sys/syslog.h文件,我们可以看到syslog支持的option如下:

    1. /*  
    2.  * Option flags for openlog.  
    3.  *  
    4.  * LOG_ODELAY no longer does anything.  
    5.  * LOG_NDELAY is the inverse of what it used to be.  
    6.  */ 
    7. #define LOG_PID     0x01    /* log the pid with each message */  
    8. #define LOG_CONS            0x02    /* log on the console if errors in sending */  
    9. #define LOG_ODELAY  0x04    /* delay open until first syslog() (default) */  
    10. #define LOG_NDELAY  0x08    /* don't delay open */  
    11. #define LOG_NOWAIT  0x10    /* don't wait for console forks: DEPRECATED */  
    12. #define LOG_PERROR  0x20    /* log to stderr as well */  
    13. 我们可以通过与操作结合这些option。syslog支持的faclility如下:

      1. /* facility codes */ 
      2. #define LOG_KERN            (0<<3)    /* kernel messages */  
      3. #define LOG_USER            (1<<3)    /* random user-level messages */  
      4. #define LOG_MAIL            (2<<3)    /* mail system */  
      5. #define LOG_DAEMON  (3<<3)    /* system daemons */  
      6. #define LOG_AUTH            (4<<3)    /* security/authorization messages */  
      7. #define LOG_SYSLOG  (5<<3)    /* messages generated internally by syslogd */  
      8. #define LOG_LPR     (6<<3)    /* line printer subsystem */  
      9. #define LOG_NEWS            (7<<3)    /* network news subsystem */  
      10. #define LOG_UUCP            (8<<3)    /* UUCP subsystem */  
      11. #define LOG_CRON            (9<<3)    /* clock daemon */  
      12. #define LOG_AUTHPRIV    (10<<3)   /* security/authorization messages (private) */  
      13. #define LOG_FTP     (11<<3)   /* ftp daemon */  

      facility的ID(上面对应的数值)与名字的对应关系如下:

      1. "auth", LOG_AUTH },   
      2. "authpriv", LOG_AUTHPRIV },   
      3. "cron", LOG_CRON },   
      4. "daemon", LOG_DAEMON },   
      5. "ftp", LOG_FTP },   
      6. "kern", LOG_KERN },   
      7. "lpr", LOG_LPR },   
      8. "mail", LOG_MAIL },   
      9. "mark", INTERNAL_MARK },      /* INTERNAL */  
      10. "news", LOG_NEWS },   
      11. "security", LOG_AUTH },       /* DEPRECATED */  
      12. "syslog", LOG_SYSLOG },   
      13. "user", LOG_USER },   
      14. "uucp", LOG_UUCP },  

      这个对应关系作用是是将syslog系统调用中facility ID和syslog.conf文件中的配置选项对应起来。后面将详细讲解。facility的作用是指明调用syslog应用的类型。syslog支持的priority如下:

      1. #define LOG_EMERG   0   /* system is unusable */  
      2. #define LOG_ALERT   1   /* action must be taken immediately */  
      3. #define LOG_CRIT            2   /* critical conditions */  
      4. #define LOG_ERR     3   /* error conditions */  
      5. #define LOG_WARNING 4   /* warning conditions */  
      6. #define LOG_NOTICE  5   /* normal but significant condition */  
      7. #define LOG_INFO            6   /* informational */  
      8. #define LOG_DEBUG   7   /* debug-level messages */  

      priority的ID(上面对应的数值)与名字的对应关系如下:

      1. "alert", LOG_ALERT },   
      2. "crit", LOG_CRIT },   
      3. "debug", LOG_DEBUG },   
      4. "emerg", LOG_EMERG },   
      5. "err", LOG_ERR },   
      6. "error", LOG_ERR },       /* DEPRECATED */  
      7. "info", LOG_INFO },   
      8. "none", INTERNAL_NOPRI },     /* INTERNAL */  
      9. "notice", LOG_NOTICE },   
      10. "panic", LOG_EMERG },     /* DEPRECATED */  
      11. "warn", LOG_WARNING },        /* DEPRECATED */  
      12. "warning", LOG_WARNING },  

      这个对应关系的作用和facility情况是相同的,都是为了与syslog.conf文件中的配置选项对应起来。priority的作用是指明日记记录的优先级,也可以理解成记录时间的严重程度。在实际使用中,syslog函数中的priority参数实际上是前面提到的facility和priority的组合,通过与操作。

      回到前面提到的syslog.conf文件和testsyslog的程序,根据前面的分析,我们来研究一下为什么testsyslog会将日记记录写到文件/var/log/messages中,而不是别的文件。

      syslog.conf文件行的基本语法是这样的:

      [消息类型(规则)]     [处理方案(日记文件)]

      这里需要注意的是,两者之间必须用一个或者多个Tab字符分开。消息类型是由”消息来源“(facility)和”紧急程度“(priority)构成,中间点号连接。如前面syslog.conf文件中的news.crit表示来自news的”关键“状况。这里,news表示消息来源,crit表示关键状况。通配符*表示一切消息来源,如第一条规则:*.info,将info级以上(notice,warning, err, alert, emerg)(priority表)的所有消息发送到日记文件/var/log/messages。而testsyslog程序中,调用syslog函数时指定的priority是LOG_USER | LOG_INFO,根据上面提到的ID和名字对应的关系,对应的消息类型规则是user.info,包含在规则*.info中,所以日记记录会写到/var/log/messages。

      修改syslog.conf文件

      一般来说,我们希望能够为自己的应用程序指定特定的日记文件。这时候,我们就需要修改syslog.conf文件。假设我们现在要把调试(debug)日记记录写到文件/var/log/debug文件中。第一步要做的是,在syslog.conf文件添加如下消息规则作为第一条规则:

      1. user.debug                  /var/log/debug  

      要是添加的新规则生效,第二步我们需要重启syslogd和klogd:service syslog restart(ubuntu下为/etc/init.d/rsyslog restart)

      为了测试新规则是否生效,我们可以将testsyslog修改如下:

      1. #include <syslog.h>   
      2.   
      3. int main(int argc, char *argv[])   
      4. {   
      5.     openlog("testsyslog", LOG_CONS | LOG_PID, 0);   
      6.     syslog(LOG_USER | LOG_DEBUG, "syslog test message generated in program %s \n", argv[0]);   
      7.     closelog();   
      8.     return 0;   
      9. }  

      编译生成执行文件后,每运行一次,/var/log/debug文件都会增加一条新的记录

  • 相关阅读:
    DIY 作品 及 维修 不定时更新
    置顶,博客中所有源码 github
    openwrt PandoraBox PBR-M1 极路由4 HC5962 更新固件
    使用 squid 共享 虚拟专用网至局域网
    第一次参加日语能力测试 N5
    libx264 libfdk_aac 编码 解码 详解
    开发RTSP 直播软件 H264 AAC 编码 live555 ffmpeg
    MFC Camera 摄像头预览 拍照
    http2 技术整理 nginx 搭建 http2 wireshark 抓包分析 server push 服务端推送
    plist 图集 php 批量提取 PS 一个个切
  • 原文地址:https://www.cnblogs.com/wangkangluo1/p/2526011.html
Copyright © 2011-2022 走看看