zoukankan      html  css  js  c++  java
  • 调试程序时如何用syslog来打印信息

    转自:https://www.cnblogs.com/vigarbuaa/archive/2013/02/05/2892544.html

    Linux下C语言编程的-把程序输出信息加到系统日志里去
    关键词: Linux    系统日志    syslog    服务程序    syslogd                                           
    我们的程序一般都会产生输出信息。但是服务器程序一般却不希望输出信息到屏幕上,因为没有人盯着你的程序执行。所以我们要把一些信息写成日志文件,正常情况下运行程序的人不用关心日志里的内容,只有在出现问题的时候才会查看日志文件里的内容以确定问题所在。
    但如果我们的程序要自己生成一个文件来保存日志却不是好主意,因为这一方面增加了维护程序运行的人的负担,另一方面自己维护起系统来也多有不便。
    在Linux系统中有一个系统日志,通常放在/var/log目录下,比如文件名是syslog的,系统中的一些程序产生的日志信息都会存放到这个文件里。日志文件有固定的格式,比如第1列是消息产生的时间,第2列是机器名(因为日志记录程序支持远程连接),第3列是标记信息(一般就是程序名称)等。而且对应的有一些工具来对这个日志进行维护,比如通过轮回机制保证日志文件大小不会把磁盘空间占尽。所以我们把自己程序的信息也写到这个系统日志里是比较好的想法。
    在GNU C语言库提供的内容中,有接口可以用来做这件事。用下面的命令查看:
    nm -D /lib/libc.so.6 | grep log

    可以看到一些调用:
    000b9410 T closelog
    0008b870 T getlogin
    0008b960 T getlogin_r
    000d0180 T __getlogin_r_chk
    000bd190 T klogctl
    00027450 T __open_catalog
    000b9380 T openlog
    0008bae0 T setlogin
    000b8b80 T setlogmask
    000b9350 T syslog
    000b9320 T __syslog_chk
    000b92f0 T vsyslog
    000b8da0 T __vsyslog_chk
     
    这里面的三个函数openlog, syslog, closelog是一套系统日志写入接口。另外那个vsyslog和syslog功能一样,只是参数格式不同。
    程序的用法示例代码如下:
    #include <syslog.h>
    int main(int argc, char **argv)
    {
        openlog("MyMsgMARK", LOG_CONS | LOG_PID, 0);
        syslog(LOG_DEBUG,
               "This is a syslog test message generated by program '%s'/n",
               argv[0]);
        closelog();
        return 0;
    }
     
    编译生成可执行程序后,运行一次程序将向/var/log/syslog文件添加一行信息如下:
     Feb 12 08:48:38 localhost MyMsgMARK[7085]: This is a syslog test message generated by program './a.out' 
     
    openlog及closelog函数说明
    此函数原型如下:
    void openlog(const char *ident, int option, int facility);
    此函数用来打开一个到系统日志记录程序的连接,打开之后就可以用syslog或vsyslog函数向系统日志里添加信息了。而closelog函数就是用来关闭此连接的。
    openlog的第一个参数ident将是一个标记,ident所表示的字符串将固定地加在每行日志的前面以标识这个日志,通常就写成当前程序的名称以作标记。第二个参数option是下列值取与运算的结果:LOG_CONS, LOG_NDELAY, LOG_NOWAIT, LOG_ODELAY, LOG_PERROR, LOG_PID,各值意义请参考man openlog手册:
           LOG_CONS
                  Write directly to system console if there is an error while sending to system logger.

           LOG_NDELAY
                  Open the connection immediately (normally, the connection is opened when the first message is logged).

           LOG_NOWAIT
                  Don’t  wait  for  child processes that may have been created while logging the message.  (The GNU C library does not create a
                  child process, so this option has no effect on Linux.)

           LOG_ODELAY
                  The converse of LOG_NDELAY; opening of the connection is delayed until syslog() is called.  (This is the  default,  and  need
                  not be specified.)

           LOG_PERROR
                  (Not in SUSv3.) Print to stderr as well.

           LOG_PID
                  Include PID with each message.
     
    第三个参数指明记录日志的程序的类型。

     void   openlog(   char   *ident,   int   option,   int     facility)       
      void   syslog(   int   priority,   char   *format,   ...)       
      void   closelog(   void   )       
      option       
                    用於openlog()的option参数可以是以下几个的组合:       
        
                    LOG_CONS   :   如果送到system   logger时发生问题,直接写入系统console。       
                    LOG_NDELAY   :   立即开启连接(通常,连接是在第一次写入讯息时才打开的)。       
                    LOG_PERROR   :     将讯息也同时送到stderr       
                    LOG_PID   :     将PID含入所有讯息中       
        
            facility       
                    facility参数用来指定何种程式在记录讯息,这可让设定档来设定何种讯息如何处理。       
        
                    LOG_AUTH   :   安全/授权讯息(别用这个,请改用LOG_AUTHPRIV)       
                    LOG_AUTHPRIV   :   安全/授权讯息       
                    LOG_CRON   :   时间守护神专用(cron及at)       
                    LOG_DAEMON   :   其它系统守护神       
                    LOG_KERN   :   核心讯息       
                    LOG_LOCAL0到LOG_LOCAL7   :   保留       
                    LOG_LPR   :   line   printer次系统       
                    LOG_MAIL   :   mail次系统       
                    LOG_NEWS   :   USENET   news次系统       
                    LOG_SYSLOG   :   syslogd内部所产生的讯息       
                    LOG_USER(default)   :   一般使用者等级讯息       
                    LOG_UUCP   :   UUCP次系统       
        
            level       
                    决定讯息的重要性.     以下的等级重要性逐次递减:       
        
                    LOG_EMERG   :   系统无法使用       
                    LOG_ALERT   :   必须要立即采取反应行动       
                    LOG_CRIT   :   重要状况发生       
                    LOG_ERR   :   错误状况发生       
                    LOG_WARNING   :   警告状况发生       
                    LOG_NOTICE   :   一般状况,但也是重要状况       
                    LOG_INFO   :   资讯讯息       
                    LOG_DEBUG   :   除错讯息      

    syslog函数及参数
    syslog函数用于把日志消息发给系统程序syslogd去记录,此函数原型是:
    void syslog(int priority, const char *format, ...);
    第一个参数是消息的紧急级别,第二个参数是消息的格式,之后是格式对应的参数。就是printf函数一样使用。

    如果我们的程序要使用系统日志功能,只需要在程序启动时使用openlog函数来连接syslogd程序,后面随时用syslog函数写日志就行了。

    另外,作为syslog的替代程序的新一代工具是syslog-ng,syslog-ng具有很强的网络功能,可以方便地把多台机器上的日志保存到一台中心日志服务器上。

  • 相关阅读:
    各国语言缩写列表,各国语言缩写-各国语言简称,世界各国域名缩写
    How to see log files in MySQL?
    git 设置和取消代理
    使用本地下载和管理的免费 Windows 10 虚拟机测试 IE11 和旧版 Microsoft Edge
    在Microsoft SQL SERVER Management Studio下如何完整输出NVARCHAR(MAX)字段或变量的内容
    windows 10 x64系统下在vmware workstation pro 15安装macOS 10.15 Catelina, 并设置分辨率为3840x2160
    在Windows 10系统下将Git项目签出到磁盘分区根目录的方法
    群晖NAS(Synology NAS)环境下安装GitLab, 并在Windows 10环境下使用Git
    使用V-2ray和V-2rayN搭建本地代理服务器供局域网用户连接
    windows 10 专业版安装VMware虚拟机碰到的坑
  • 原文地址:https://www.cnblogs.com/noxy/p/9890741.html
Copyright © 2011-2022 走看看