文章目录
  1. Linux系统日志
    1. rsyslogd的配置文件
  2. syslog函数
    1. 日志的过滤
    2. 关闭日志功能

Linux系统日志

Linux现在提供守护进程rsyslogd来处理系统日志。rsyslogd守护进程既能接收用户进程输出的日志,也能接收内核日志。

用户进程通过调用syslog函数生成系统日志;syslog函数将日志输出到一个UNIX本地域socket类型(AF_UNIX)的文件/dev/log;rsyslogd则监听/dev/log文件以获取用户进程的日志输出。

内核日志由printk等函数打印至内核的环状缓存(ring buffer)中;环状缓存中的内容直接映射到/proc/kmsg文件中;rsyslogd通过读取/proc/kmsg文件获得内核日志。

rsyslogd在接收到用户进程或内核输入的日志后,会将他们输出至某些特定的日志文件;默认情况下,调试信息保存在/var/log/debug,普通信息保存在/var/log/messages,内核消息则保存在/var/log/kernel.log;

Linux系统的日志体系如下图。

 

rsyslogd的配置文件

rsyslogd的主配置文件为/etc/rsyslog.conf,其中主要可以设置的项包括:内核日志输入路径、是否接收UDP日志及其监听端口、日志文件的权限、包含哪些子配置文件(如/etc/rsyslog.d/*.conf);而rsyslogd的子配置文件则指定各类日志的目标存储文件。

syslog函数

应用程序可使用syslog函数与rsyslogd守护进程通信。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/*
引用方式: #include <syslog.h>
priority: 设施值与日志级别的按位或
设施值: 默认为LOG_USER
日志级别
0: 系统不可用
1: 报警, 需立即采取行动
2: 非常严重的情况
3: 错误
4: 警告
5: 通知
6: 信息
7: 调试
mes: 日志信息
*/
void syslog(int priority, const char * mes);

openlog函数可进一步改变syslog的默认输出方式,进一步结构化日志内容。

1
2
3
4
5
6
7
8
9
10
11
/*
引用方式: #include <syslog.h>
ident: 此处字符串会被添加到日志消息的日期与时间之后(通常为程序名)
logopt: 对后续syslog的行为进行配置, 取如下值的按位或
LOG_PID 0x01 在日志消息中包含程序PID
LOG_CONS 0x02 若消息不能记录到日志文件, 则打印至终端
LOG_ODELAY 0x04 延迟打开日志功能直到第一次调用syslog
LOG_NDELAY 0x08 不延迟打开日志功能
fac: 修改syslog函数中的默认设施值
*/
void openlog(const char * ident, int logopt, int fac);

日志的过滤

在程序开发过程中,可能需要输出很多调试信息;而程序发布后,我们需要将这些调试信息关闭;这通过设置日志掩码来实现:使日志级别大于日志掩码的日志信息被系统忽略。setlogmask函数用于设置syslog的日志掩码。

1
2
3
4
5
6
/*
引用方式: #include <syslog.h>
mask: 日志掩码值
函数始终会成功, 返回调用进程先前的日志掩码值
*/
int setlogmask(int mask);

关闭日志功能

使用closelog函数关闭日志功能。

1
2
3
4
/*
引用方式: #include <syslog.h>
*/
void closelog();