• Linux 日志系统API详解


    1. API概述

    1.1 openlog

    1. 函数声明如下:
      void openlog(const char* ident, int option, int facility);
      
      • 1
    2. 函数介绍
      1. 功能:
        用来建立与系统日志的链接,获取对系统日志文件的操作权
      2. 参数:
        ident用来指定每条日志记录的前缀,通常设置为程序名称,如果为NULL,则使用程序名称作为前缀
        option指定openlog()syslog()调用的标志,如果未指定则使用默认值
        facility用于指定产生消息的程序类型。从而根据配置文件的设定将来自不同程序类型的消息将以不同的方式处理
      3. 注意:
        openlog()函数是可选的,若不使用此函数,它将由syslog()自动调用,此时ident将默认为NULL
    3. 参数之详细介绍
      1. option 值是一个位掩码,可有以下值进行或运算进行组合使用

        项目描述
        LOG_CONS如果在写入到系统log时出现错误,则直接写入系统控制台
        LOG_NDELAY立即打开连接(通常,在产生第一条消息时打开连接)。这会很有用,例如,如果后续调用 chroot() 会使日志工具内部使用的路径名无法访问。
        LOG_NOWAIT不等待在写入消息时可能已创建的子进程。(GNU C 库不创建子进程,所以这个选项对 Linux 没有影响)
        LOG_ODELAY连接的打开被延迟到 syslog() 被调用(这是默认值,无需指定)
        LOG_PERROR(不在 POSIX.1-2001 或 POSIX.1-2008 中)还将消息记录到 stderr
        LOG_PID每条消息中包含调用者的 PID
      2. facility

        项目描述
        LOG_AUTH安全/授权消息
        LOG_AUTHPRIV安全/授权消息(私有)
        LOG_CRON时钟守护进程(cron 和 at)
        LOG_DAEMON没有单独设备值的系统守护进程
        LOG_FTPftp 守护进程
        LOG_KERN内核消息(不能从用户进程生成)
        LOG_LOCAL0 ~ LOG_LOCAL7保留供本地使用
        LOG_LPR行打印子系统
        LOG_MAIL邮件子系统
        LOG_NEWSUSENET新闻子系统
        LOG_SYSLOG由 syslogd内部生成的消息
        LOG_USER通用用户级消息
        LOG_UUCPUUCP(Unix-to-Unix Copy) subsystem

    2.2 syslog and vsyslog

    1. 函数声明如下:
      void syslog(int priority, const char* format, ...);
      void vsyslog(int priority, const char *format, va_list ap);
      
      • 1
      • 2
    2. syslog()函数介绍
      1. 功能:
        syslog()生成一条日志信息,该消息将由syslogd守护进行分发
      2. 参数:
        priority 参数是将 facilitylevel 组合在一起形成的。如果 facility 没有设置则使用openlog()设置的值,若openlog()没有被调用,则使用默认值 LOG_USER
    3. vsyslog()函数介绍
      vsyslog() 执行与 syslog() 相同的任务,不同之处在于它采用一组使用 stdarg() 变量参数列表宏获得参数。

    2.3 closelog

    1. 函数声明如下:
      void closelog(void)
      
      • 1
    2. 函数介绍
      closelog()用于关闭系统日志文件的描述符。closelog()函数可用可不用

    2.4 有关level设置的函数

    1. 函数声明如下:

       int setlogmask(int mask);
      
      • 1
    2. 函数介绍

      1. 功能:
        进程有一个日志优先级掩码,用于确定哪些syslog()的调用可以被记录。其他的调用将被忽略,初始掩码是为所有优先级启用日志记录。
        setlogmask() 函数为调用进程设置此日志掩码,并返回前一个掩码。 如果掩码参数为 0,则不会修改当前日志掩码。
      2. 参数:
        优先级掩码(即level的值)
    3. 参数之详细介绍
      level 值,下列按照消息的重要性降序排列

      项目描述
      LOG_EMERG系统无法使用
      LOG_ALERT必须立即采取行动
      LOG_CRIT临界条件
      LOG_ERR错误条件
      LOG_WARNING警告条件
      LOG_NOTICE正常但重要的情况
      LOG_INFO信息性消息
      LOG_DEBUG调试级消息

    2. /var/log 内容概要

    2.1 /var/log内容概要

    1. /var/log/lastlog : 使用者最近登入系统的时间
    2. /var/log/wtmp : 使用者登录及退出系统的时间
    3. /var/log/secure : 登录系统信息
    4. /var/log/maillog : 记录mail相关信息
    5. /var/log/cron : 记录 crontab 的相关讯息定时器的信息
    6. /var/log/dmesg : 开机时的画面讯息
    7. /var/log/xferlog : ftp日志信息
    8. /var/log/messages : 大部分信息都记录在此

    2.2 配置文件

    1. rsyslog.conf
      主要用于rsyslogd的一些环境配置
    2. 50-default.conf
      具体的日志规则

    3. 实例

        #include 
        #include 
    
        int main(){
            // 打开log文件, 第三个参数设置位0,以便在syslog()更灵活设置,避免反复设置
            openlog("tetslog",LOG_CONS | LOG_PID, 0);
            // 产生log信息 
            syslog(LOG_USER | LOG_DEBUG,"test log %s %d",__FILE__,__LINE__);
            // 关闭
            closelog();
            return 0;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    由于 openlog()closelog() 均为可选函数,所以可精简至一行

        #include 
        #include 
    
        int main(){
            // 产生log信息 
            syslog(LOG_USER | LOG_DEBUG,"test log %s %d",__FILE__,__LINE__);
            return 0;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    参考:
    1. https://man7.org/linux/man-pages/man3/openlog.3.html

  • 相关阅读:
    关于vue中关于eslint报错的问题
    el-menu动态加载路由,菜单的解决方案
    ChatGPT改写:论文写作新时代
    满帮web页面首屏秒开解决之道
    LeetCode437:路径总和III
    Liunx-03用户、组、权限管理
    你 offo 来了!阿里限产教科书级 Elasticsearch 核心手册
    快速入门:如何使用HTTP代理进行网络请求
    命令行远程操作windows
    【CV】Reg2Net:一种用于计算机视觉任务的多尺度骨干架构
  • 原文地址:https://blog.csdn.net/weixin_41111116/article/details/120239768