介绍

        syslog是Unix系统的日志系统。可以将日志记录在本地系统中。

        一个完整的syslong日志包含如下信息:程序模块 | 严重性 | 时间 | 主机名 | 进程名 | 进程ID | 正文。

syslong相关函数

1. openlog()函数。调用openlog()函数时可选的。如果不调用openlog()函数,则在第一次调用syslong()函数时打开日志连接。

#include <syslog.h>

/*
 * ident: 标记,ident表示的字符串将添加在每行日志的前面,用以标记日志.
 *
 * option: 调用syslong()函数时的控制标志,标志的含义如下:
 *         LOG_CONS: 如果将日志发送给syslogd守护进程时发生错误,则将日志显示到终端。
 *         LOG_NDELAY: 立即打开与系统日志的连接。
 *         LOG_ODELAY: 类似于LOG_NDELAY,与系统日志的连接只有在调用syslog()函数时才建立。
 *         LOG_PERROR: 将信息写入日志文件的同时,将日志发送到错误输出。
 *         LOG_PID: 每条日志中都包含进程ID。
 *
 * facility: 指定记录日志程序的类型。
 *         LOG_AUTH: 认证系统(login, su, getty等)。
 *         LOG_AUTHPRIV: 同 LOG_AUTH 但只登陆到所选择的单个用户可读的文件中。
 *         LOG_CRON: cron守护进程。
 *         LOG_DAEMON: 其他系统守护进程。
 *         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 openlog(const char *ident, int option, int facility);

2. syslog()函数。syslog()函数类似于write()函数,往系统日志文件中写日志。系统日志文件的存储位置一般在/var/log/目录下。syslog()函数把日志写在/var/log/syslog文件中。

#include <syslog.h>
/*
 * priority: 表示日志级别。
 *        LOG_EMERG: 紧急情况.
 *        LOG_ALERT: 应该被立即改正的问题,如系统数据库破坏.
 *        LOG_CRIT: 重要情况,如硬盘错误.
 *        LOG_ERR: 错误.
 *        LOG_WARNING: 警告信息.
 *        LOG_NOTICE: 不是错误情况,但是可能需要处理.
 *        LOG_INFO: 情报错误.
 *        LOG_DEBUG: 包含情报的信息,通常指在调试一个程序时使用.
*/
void syslog(int priority, const char *fmt, ...);

3. closelog()函数。关闭日志设备。closelog()函数调用也是可选的,它只是关闭被用于与syslog守护进程通信的描述符。

#include <syslog.h>

void closelog(void);

syslog实例

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

#define BUFSZ 4096

static void log_msg(const char *fmt, ...)
{
    char buf[BUFSZ];
    va_list ap;
    va_start(ap, fmt);
    vsnprintf(buf, BUFSZ - 1, fmt, ap);
    strcat(buf, "\n");

    openlog("test", LOG_CONS | LOG_NDELAY | LOG_PERROR, LOG_USER);  // 该行可选
    syslog(LOG_INFO, "%s", buf);
    closelog();  // 该行可选
}

int main(int argc, char *argv[])
{
    log_msg("Hellow World. This is a syslog test.");
    exit(0);
}

运行该程序后,可以在/var/log/syslog文件中看到相关的打印信息。

01-16 16:32