七.linux系统日志之使用syslog来记录调试信息

版权声明:本文为博主原创文章,允许转载请注明。谢谢! https://blog.csdn.net/wangweijundeqq/article/details/89603622

https://note.youdao.com/ynoteshare1/index.html?id=704b0a1aa0f492a45b3a3828e478b5fa&type=note

一、使用syslog来记录调试信息

syslog 是一种工业标准的协议,用来记录设备的日志

1、openlog、syslog、closelog函数

openlog为当前的应用程序打开一个log文件

syslog用来记录一条信息

closelog用来关闭本程序的log文件

可以使用这三个函数,为系统文件写一条条的日志,用日志来做记录,日志信息就是一个文件,通过查看这个文件,就知道发生了什么事情,

  • 常见linux系统的日志文件:

/var/log/dmesg      内核引导信息日志

/var/log/message    标准系统错误信息日志

/var/log/maillog    邮件系统信息日志

/var/log/cron       计划任务日志

/var/log/secure     安全信息日志

而我们的ubuntu中是在/var/log/syslog文件中的,比如要查看ubuntu中的日志文件则:cat /var/log/syslog 即可

2、各种参数

#include <syslog.h>

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

void syslog(int priority, const char *format, ...);

void closelog(void);

  • ident:

指向信息的指针,一般为程序名,表示当前应用程序的名字,因为我们很多程序都会向日志文件写信息,日志信息是共用的,log要知道具体这一条是谁写的。

  • option 、facility是一些宏定义

LOG_CONS:

LOG_PID:每一条信息里面加上PID,知道是哪个进程发的

因为父子进程的进程名字(ident)是一样的,必须要通过PID来区别

  • facility

跟什么相关的信息,默认的LOG_USER,绝大多数用的这个。

  • priority

日志信息的重要程度,共有8个紧张程度

一般用 LOG_INFO即可。

   0: LOG_EMERG,紧急情况

   1: LOG_ALERT,高优先级故障,例如数据库崩溃

   2: LOG_CRIT,严重错误,例如硬件故障

   3: LOG_ERR,错误

   4: LOG_WARNING,警告

   5: LOG_NOTICE,需要注意的特殊情况

   6: LOG_INFO,一般信息

   7: LOG_DEBUG,调试信息

3、编程实战

#include <stdio.h>

#include <syslog.h>

#include <sys/types.h>

#include <unistd.h>

int main(void)

{

printf("my pid = %d.\n", getpid());

openlog("b.out", LOG_PID | LOG_CONS, LOG_USER);

//打印多条日志信息

syslog(LOG_INFO, "this is my log info.%d", 23);

syslog(LOG_INFO, "this is another log info.");

syslog(LOG_INFO, "this is 3th log info.");

closelog();

}

因为在Ubuntu中, log信息var/log/syslog文件中

其实系统中一直有一个守护进程syslogd,我们调用syslog函数,是给这个进程发消息,这个服务进程将消息保存在/ var/log/syslog文件中里面

用 cat /var/log/syslog 打开

4、总结

syslogd日志文件系统的服务器进程,提供日志服务,任何进程通过这三个函数跟syslogd通信,这就是OS提供的服务式的设计,FTP也是同理。

5、让程序不能被多次运行,即重复运行

  • 问题

(1)因为守护进程是长时间运行而不退出,因此./a.out执行一次就有一个进程,执行多次就有多个进程。

(2)这样并不是我们想要的。我们守护进程一般都是服务器,服务器程序只要运行一个就够了。

(3)因此我们希望我们的程序具有一个单例运行的功能。即当我们./a.out去运行程序时,不会重复执行程序。

  • 实现方法:

用一个文件的存在与否来做标志。具体做法是程序在执行之初去判断一个特定的文件是否存在,若存在则标明进程已经在运行,若不存在则标明进程没有在运行。然后运行程序时去创建这个文件。当程序结束的时候去删除这个文件即可。

  • 编程实战

#include <stdio.h>

#include <sys/types.h>

#include <sys/stat.h>

#include <fcntl.h>

#include <errno.h>

void delete();

#define FILE "/var/aliya_tset_single"

int main(void)

{

int fd=-1; //fd file descriptor,文件描述符

//第一步:判断文件是否存在,若是,则报错,否建立

fd=open(FILE,O_CREAT|O_RDWR|O_TRUNC|O_EXCL,0664 );

if(fd<0)

{

if(errno == EEXIST)

{

printf("进程已经存在,请勿重复执行!\n");

return -1;

}

}

//第二步:进程执行完毕后删除这个文件。

atexit(delete);

int i=0;

for(i=0;i<10;i++)

{

sleep(1);

printf("running....%d\n",i);

}

}

void delete()

{

remove(FILE);//删除文件

}

猜你喜欢

转载自blog.csdn.net/wangweijundeqq/article/details/89603622