Linux 日志系统API详解

本文详细介绍了Linux日志系统的API,包括openlog、syslog、vsyslog和closelog等函数的功能与使用方法,并提供了/var/log目录下各文件的作用概览以及配置文件说明。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. API概述

1.1 openlog

  1. 函数声明如下:
    void openlog(const char* ident, int option, int facility);
    
  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);
    
  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)
    
  2. 函数介绍
    closelog()用于关闭系统日志文件的描述符。closelog()函数可用可不用

2.4 有关level设置的函数

  1. 函数声明如下:

     int setlogmask(int mask);
    
  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 <stdio.h>
    #include <syslog.h>

    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;
    }

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

    #include <stdio.h>
    #include <syslog.h>

    int main(){
        // 产生log信息 
        syslog(LOG_USER | LOG_DEBUG,"test log %s %d",__FILE__,__LINE__);
        return 0;
    }

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值