dmesg打印信息如何后台保存到文件中
2014-10-11 15:11
561 查看
dmesg调试i信息常常作为判断系统异常退出的重要信息,但是当个系统异常退出或重启时,信息又难以保存下来,于是才有了将dmesg调试信息保存到文件中的想法:
[cpp] view
plaincopy
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
//#include <linux/autoconf.h>//内核编译的配置信息
#include <sys/klog.h>
#include <sys/stat.h>
//#define __LOG_BUF_LEN (1 << CONFIG_LOG_BUF_SHIFT)//在2.6.28内核中为默认1<<17,这才是真正dmesg buffer的大小,网上其他都扯淡。
#define __LOG_BUF_LEN (1 << 17)//在2.6.28内核中为默认1<<17,这才是真正dmesg buffer的大小,网上其他都扯淡。
#define __LOG_PATH "/home/default/dmesg.log"
#define LOG_SLEEP(x) (sleep(x))
#define __LOG_SIZE 10485760//大于10M时删除文件
#define BUF_SIZE 256
long check_log_size(void)
{
struct stat f_stat;
if( stat( __LOG_PATH, &f_stat ) == -1 )
{
return -1;
}
return (long)f_stat.st_size;
}
int main(int argc, char *argv[])
{
char buf[__LOG_BUF_LEN]={0,};
char tmpbuf[BUF_SIZE]={0,};
int ret = 0;
FILE *fp =NULL;
struct tm *ptr;
time_t lt;
//daemon(0,0);//进入守护模式
while(1)
{
LOG_SLEEP(120);//sleep 10 秒
fp = fopen(__LOG_PATH,"a+");//追加打开
if(NULL == fp)
{
printf("creat file faild !\n");
continue;
}
ret = klogctl(4,buf,__LOG_BUF_LEN);//获得dmesg信息,该函数需要超级用户权限运行
if(0 >= ret){
perror("klogctl ");
fclose(fp);
continue;
}
lt = time(NULL);//获得时间
ptr = (struct tm *)localtime(<);
sprintf(tmpbuf," [LOG TIME:] %s",asctime(ptr));//记录时间
printf("tmpbuf = %s\n",tmpbuf);
fwrite(tmpbuf,strlen(tmpbuf),1,fp);
fwrite(buf,strlen(buf),1,fp);
fflush(fp);
fclose(fp);
if(__LOG_SIZE < check_log_size())
{
unlink(__LOG_PATH);//删除该文件
}
memset(tmpbuf,0,BUF_SIZE);
memset(buf,0,__LOG_BUF_LEN);
}
return 0;
}
以下是Makefil
[cpp] view
plaincopy
CC := arm-none-linux-gnueabi-gcc
all:dmesg_test
dmesg_test:dmesg_test.c
$(CC) dmesg_test.c -o dmesg_test -Wall
install:
cp dmesg_test /nfsroot/update
clean:
rm dmesg_test
运行:dmesg_test &
程序就进入后台执行了,每隔120秒会读取一次dmesg信息。
[cpp] view
plaincopy
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
//#include <linux/autoconf.h>//内核编译的配置信息
#include <sys/klog.h>
#include <sys/stat.h>
//#define __LOG_BUF_LEN (1 << CONFIG_LOG_BUF_SHIFT)//在2.6.28内核中为默认1<<17,这才是真正dmesg buffer的大小,网上其他都扯淡。
#define __LOG_BUF_LEN (1 << 17)//在2.6.28内核中为默认1<<17,这才是真正dmesg buffer的大小,网上其他都扯淡。
#define __LOG_PATH "/home/default/dmesg.log"
#define LOG_SLEEP(x) (sleep(x))
#define __LOG_SIZE 10485760//大于10M时删除文件
#define BUF_SIZE 256
long check_log_size(void)
{
struct stat f_stat;
if( stat( __LOG_PATH, &f_stat ) == -1 )
{
return -1;
}
return (long)f_stat.st_size;
}
int main(int argc, char *argv[])
{
char buf[__LOG_BUF_LEN]={0,};
char tmpbuf[BUF_SIZE]={0,};
int ret = 0;
FILE *fp =NULL;
struct tm *ptr;
time_t lt;
//daemon(0,0);//进入守护模式
while(1)
{
LOG_SLEEP(120);//sleep 10 秒
fp = fopen(__LOG_PATH,"a+");//追加打开
if(NULL == fp)
{
printf("creat file faild !\n");
continue;
}
ret = klogctl(4,buf,__LOG_BUF_LEN);//获得dmesg信息,该函数需要超级用户权限运行
if(0 >= ret){
perror("klogctl ");
fclose(fp);
continue;
}
lt = time(NULL);//获得时间
ptr = (struct tm *)localtime(<);
sprintf(tmpbuf," [LOG TIME:] %s",asctime(ptr));//记录时间
printf("tmpbuf = %s\n",tmpbuf);
fwrite(tmpbuf,strlen(tmpbuf),1,fp);
fwrite(buf,strlen(buf),1,fp);
fflush(fp);
fclose(fp);
if(__LOG_SIZE < check_log_size())
{
unlink(__LOG_PATH);//删除该文件
}
memset(tmpbuf,0,BUF_SIZE);
memset(buf,0,__LOG_BUF_LEN);
}
return 0;
}
以下是Makefil
[cpp] view
plaincopy
CC := arm-none-linux-gnueabi-gcc
all:dmesg_test
dmesg_test:dmesg_test.c
$(CC) dmesg_test.c -o dmesg_test -Wall
install:
cp dmesg_test /nfsroot/update
clean:
rm dmesg_test
运行:dmesg_test &
程序就进入后台执行了,每隔120秒会读取一次dmesg信息。
相关文章推荐
- dmesg打印信息如何后台保存到文件中
- dmesg打印信息如何后台保存到文件中
- 如何将信息打印在控制台或某个文件下
- C#中如何将信息保存到txt文件中去,以及如何读取
- Makefile & Android.mk文件中如何输出打印信息
- android ndk如何打印信息以及其头文件
- Android将应用程序的崩溃信息如何保存到本地文件,并上传服务器
- linux重定向总结:如何将shell命令的输出信息自动输出到文件中保存
- 如何把jvm垃圾回收信息打印到文件
- Android.mk文件中如何输出打印信息 .
- 保存dmesg 信息到文件源码
- 如何将DOS下执行命令的结果信息保存到一个文件
- tomcat中多个项目(web项目)共用log4j.jar的情况下,如何让其各自打印各自的日志文件。及输出同级别日志信息
- [技巧靠点点滴滴的积累] Linux平台下如何将make编译的所有信息保存至文件?
- Makefile & Android.mk文件中如何输出打印信息
- 如何知道所有在线的用户 (保存所有在线登录人信息,此处为后台人员)
- 如何把X264输出的INFO信息保存到文件
- linux重定向总结:如何将shell命令的输出信息自动输出到文件中保存
- Android将应用程序的崩溃信息如何保存到本地文件,并上传服务器
- Makefile & Android.mk文件中如何输出打印信息