热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

https:ote.youdao.comynoteshare1index.html?id704b0a1aa0f492a45b3a3828e478b5fa&typenote目录 一、

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

目录

 

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

1、openlog、syslog、closelog函数

2、各种参数

ident:

option 、facility是一些宏定义

facility

priority

3、编程实战

4、总结

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

问题

实现方法:

编程实战



一、使用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

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

#include

#include

#include

 

 

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

#include

#include

#include

#include

 

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);//删除文件

 

}


 

 

 



推荐阅读
author-avatar
郭先2502898821_918
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有