zoukankan      html  css  js  c++  java
  • Linux syslog 学习

    最经有在看lighttpd facgi相关的东西。在lighttpd官网上看到如下sample code。

    #include <stdlib.h>
    #include <string.h>
    #include <syslog.h>
    #include <alloca.h>
    #include <fcgiapp.h>
    #define LISTENSOCK_FILENO 0
    #define LISTENSOCK_FLAGS 0
    int main(int argc, char** argv) {
      openlog("testfastcgi", LOG_CONS|LOG_NDELAY, LOG_USER);
      int err = FCGX_Init(); /* call before Accept in multithreaded apps */
      if (err) { syslog (LOG_INFO, "FCGX_Init failed: %d", err); return 1; }
      FCGX_Request cgi;
      err = FCGX_InitRequest(&cgi, LISTENSOCK_FILENO, LISTENSOCK_FLAGS);
      if (err) { syslog(LOG_INFO, "FCGX_InitRequest failed: %d", err); return 2; }
    
      while (1) {
        err = FCGX_Accept_r(&cgi);
        if (err) { syslog(LOG_INFO, "FCGX_Accept_r stopped: %d", err); break; }
        char** envp;
        int size = 200;
        for (envp = cgi.envp; *envp; ++envp) size += strlen(*envp) + 11;
        char*  result = (char*) alloca(size);
        strcpy(result, "Status: 200 OK
    Content-Type: text/html
    
    ");
        strcat(result, "<html><head><title>testcgi</title></head><body><ul>
    ");
    
        for (envp = cgi.envp; *envp; ++envp) {
          strcat(result, "<li>"); 
          strcat(result, *envp); 
          strcat(result, "</li>
    ");
        }
    
        strcat(result, "</ul></body></html>
    ");
        FCGX_PutStr(result, strlen(result), cgi.out);
      }
    
      return 0;
    }
    

    此fastcgi进程是将log输出到syslog.对syslog不是很了解,于是乎查了下。syslog主要是linux的log系统。主要有下面3个api:openlog,syslog和closelog,以供用户进程将一些log写入对应的系统日志。

     void openlog(const char *ident, int option, int facility);  

    函数说明:打开日志设备,以供读取和写入,与文件系统调用的open类似;调用openlog是可选择的。如果不调用openlog,则在第一次调用syslog时,自动调用openlog。  

    参数说明:  

    ident:是一个标记,ident 所表示的字符串将固定的加在每行日志的前面一标识这个日志,通常就写成当前程序的名称以作标记。  

    option:  

    指定openlog函数和接下来调用的syslog函数的控制标志。可以取以下值:  

    LOG_CONS        如果将信息发送给 syslogd 守护进程时发生错误,直接将相关信息输出到终端  

    LOG_NDELAY      立即打开与系统日志的连接(通常情况下,只有在产生第一条日志信息的情况下才会打开与日志系统的连接)  

    LOG_ODELAY      类似于 LOG_NDELAY 参数,与系统日志的连接只有在 syslog 函数调用时才会创建  

    LOG_PERROR      在将信息写入日志的同时,将信息发送到标准错误输出  

    LOG_PID         每条日志信息中都包含进程号  

    facility :指定记录消息程序的类型,与 syslogd 守护进程的配置文件 syslog.conf 中的 facility 对应。可取如下值:  

    LOG_AUTH                    认证系统(login、su、getty等)  

    LOG_AUTHPRIV                同 LOG_AUTH 但只登陆到所选择的单个用户可读的文件中。  LOG_CRON                    cron 守护进程  

    LOG_DAEMON                  其他系统守护进程,如 routed  

    LOG_FTP                     文件传输协议:ftpd、tftpd  

    LOG_KERN                    内核产生的消息  

    LOG_LPR                     系统打印机缓冲池:lpr、lpd  

    LOG_MAIL                    电子邮件系统  

    LOG_NEWS                    网络新闻系统  

    LOG_SYSLOG                  由 syslogd(8)产生的内部消息  

    LOG_USER                    随机用户进程产生的消息  

    LOG_UUCP                    UUCP 子系统  

    LOG_LOCAL0 ~ LOG_LOCAL7     本地使用保留 

     void syslog(int priority, const char *format, ...);  

    函数说明:写入日志,与文件系统调用 write 类似。  

    priority:表示消息的级别,与 syslogd 守护进程的配置文件 syslog.conf 中的 level 对应。可取如下值:  

    LOG_EMERG                   紧急情况  

    LOG_ALERT                   应该被立即改正的问题,如系统数据库破坏  

    LOG_CRIT                    重要情况,如硬盘错误  

    LOG_ERR                     错误  

    LOG_WARNING                 警告信息  

    LOG_NOTICE                  不是错误情况,但是可能需要处理  

    LOG_INFO                    情报错误  

    LOG_DEBUG                   包含情报的信息,通常指在调试一个程序时使用 

     void closelog();  

    函数说明:关闭日志设备,与文件系统调用的close类似;调用closelog也是可选择的,它只是关闭被用于与syslog守护进程通信的描述符。  

    由于第一次了解syslog,不知道fastcgi进程的log输出到哪里。查了下是默认输出到/var/log/messages(上述sample code是输出到/var/log/user.log).但是该目录下并没有messages和user.log文件。

    这是由于syslog的config文件没有配置。

    /etc/syslog.conf文件是Linux日记系统的配置文件。(ubuntu下为/etc/rsyslog.d/50-default.conf)

    编辑/etc/rsyslog.d/50-default.conf

     
    其中有这么一段
     *.=info;*.=notice;*.=warn;
        auth,authpriv.none;
        cron,daemon.none;
        mail,news.none        -/var/log/messages
     
    这是本来就有,却被注释了(有一些选项都被注释了如LOG_USER)。现在解注释就行.
    然后重启syslog:sudo service rsyslog restart(sudo restart rsyslog).

     写了个简单的sample:

     输出结果在/var/log/user.log.如下:

     
  • 相关阅读:
    OpenStack源码系列---neutron-server
    理解全虚拟、半虚拟以及硬件辅助的虚拟化
    QEMU+GDB调试方法
    SQL Server故障转移集群
    OpenStack源码系列---nova-conductor
    mysql 安装和基本使用
    数据库原理
    linux 计划任务
    linux 进程管理和内存分配

  • 原文地址:https://www.cnblogs.com/fellow1988/p/6119826.html
Copyright © 2011-2022 走看看