rsyslog使用

1、rsyslog配置文件,/etc/rsyslog.conf,在配置文件中加入如下配置项。

local2.*    /var/log/udp_send/udp_send.loglocal2.*    /var/log/udp_send/udp_send.log

2、在/etc/logrotate.d/目录下,加入log文件配置项,新建立配置文件。内容如下:

/var/log/udp_send/udp_send.log {
    create 0777 root root
    daily
    rotate 10
    missingok
    notifempty
    copytruncate
    sharedscripts
    prerotate
    /usr/bin/chattr -a /var/log/udp_send/udp_send.log
    endscript
    postrotate
    /usr/bin/kill -HUP rsyslogd
    /usr/bin/chattr +a /var/log/udp_send/udp_send.log
    endscript
}


3、syslog接口api, openlog,syslog和closelog,头文件#include <syslog.h>  

void openlog(const char *ident, int option, int facility);

idents指向的字符串可以是想要打出的任意字符,它所表示的字符串将固定地加在每行日志的前面以标识这个日志,该标志通常设置为程序的名称。

option参数所指定的标志用来控制openlog()操作和syslog()的后续调用。他的值为具体是下列值取与运算的结果

LOG_CONS
直接写入系统控制台,如果有一个错误,同时发送到系统日志记录。
LOG_NDELAY
立即打开连接(通常,打开连接时记录的第一条消息)。
LOG_NOWAIT
不要等待子进程,因为其有可能在记录消息的时候就被创建了(GNU C库不创建子进程,所以该选项在Linux上没有影响。)
LOG_ODELAY
延迟连接的打开直到syslog函数调用。(这是默认情况下,需要没被指定的情况下。)
LOG_PERROR
(不在SUSv3情况下)同时输出到stderr(标准错误文件)。
LOG_PID
包括每个消息的PID。
facility参数是用来指定记录消息程序的类型。它让指定的配置文件,将以不同的方式来处理来自不同方式的消息。它的值可能为 LOG_KERN、LOG_USER、LOG_MAIL、LOG_DAEMON、LOG_AUTH、LOG_SYSLOG、LOG_LPR、LOG_NEWS、LOG_UUCP、LOG_CRON 或 LOG_AUTHPRIV
各个值的具体意义我们可以参照man openlog 手册。
LOG_AUTH
security/authorization messages (DEPRECATED Use LOG_AUTHPRIV
instead)
LOG_AUTHPRIV
security/authorization messages (private)
LOG_CRON
clock daemon (cron and at)
LOG_DAEMON
system daemons without separate facility value
LOG_FTP
ftp daemon
LOG_KERN
kernel messages
LOG_LOCAL0 through LOG_LOCAL7
reserved for local use
LOG_LPR
line printer subsystem
LOG_MAIL
mail subsystem
LOG_NEWS
USENET news subsystem
LOG_SYSLOG
messages generated internally by syslogd
LOG_USER (default)
generic user-level messages
LOG_UUCP
UUCP subsystem

int syslog(int priority, string message);

  1. LOG_EMERG:紧急情况,需要立即通知技术人员。
  2. LOG_ALERT:应该被立即改正的问题,如系统数据库被破坏,ISP连接丢失。
  3. LOG_CRIT:重要情况,如硬盘错误,备用连接丢失。
  4. LOG_ERR:错误,不是非常紧急,在一定时间内修复即可。
  5. LOG_WARNING:警告信息,不是错误,比如系统磁盘使用了85%等。
  6. LOG_NOTICE:不是错误情况,也不需要立即处理。
  7. LOG_INFO:情报信息,正常的系统消息,比如骚扰报告,带宽数据等,不需要处理。
  8. LOG_DEBUG:包含详细的开发情报的信息,通常只在调试一个程序时使用。

void closelog( void )

实例代码:

#include <syslog.h>   
#define US_ERR(fmt, args...) syslog(LOG_LOCAL2 | LOG_ERR, "(ERR) %s %s %d: " fmt "\n", __FILE__, __FUNCTION__, __LINE__, ##args)
#define US_DEBUG(fmt, args...) \
if (g_debug) {\
    syslog(LOG_LOCAL2 | LOG_DEBUG, "(DEBUG) %s %s %d: " fmt "\n", __FILE__, __FUNCTION__, __LINE__, ##args);\
}    
#define US_WARN(fmt, args...) syslog(LOG_LOCAL2 | LOG_WARNING, "(WARN) %s %s %d: " fmt "\n", __FILE__, __FUNCTION__, __LINE__, ##args)

openlog("udp-send", 0, LOG_LOCAL2);
US_DEBUG("just a test case");
closelog

在实际使用中,会发现,无论syslog还是rsyslog,当设置日志文件可以轮询,rotate 10 ,但其轮询方式是不受日志大小限制的,说明白点,就是即便在配置文件中设置了size 10M,日志文件到了10M,并没有重新创建新的日志文件,没怎明白为啥不起作用,所以需要单独新起线程,用于建立新的日志文件。

void * pthread_log_ctrl(void * arg) {
    while(1) {
        system("/etc/init.d/rsyslog restart > /dev/null");
        system("logrotate -f /etc/logrotate.d/cmdp_udp_send_logcfg");
        sleep(3600);
    }
    
    pthread_exit(NULL);
}

发现每次执行一次logrotate -f /etc/logrotate.d/cmdp_udp_send_logcfg,就会有一个新的日志文件,如下所示的形式。

udp_send.log  udp_send.log.1  udp_send.log.10  udp_send.log.2  udp_send.log.4  udp_send.log.5  udp_send.log.6  udp_send.log.7  udp_send.log.8  udp_send.log.9


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值