分别在Linux和Android中用C语言写系统日志
2011-01-27 15:06
543 查看
写程序难免需要用到调试信息,由于某些原因,有的调试信息想把它放到系统日志中去。因此今天试验了一下分别在Linux和Android中用C语言写系统
日志。首先是在Linux中尝试写系统日志,关于这方面的资料网上已经很多了,我先把我的代码贴到下面吧。
/****************************** syslog.c
***********************************/
#include<stdio.h>
#include<stdlib.h>
#include<syslog.h>
int main()
{
int i;
/************ 添加第一段错误记录 ************/
/*openlog函数用于打开系统日志连接,调用openlog是可选择的。如果不调用openlog,则在第一次调用syslog时,自动调用
openlog。调用openlog 使我们可以指定一个ident,以后, 此ident 将被加至每则记录消息中。ident
一般是程序的名称(例如 ,cron ,ine 等)*/
openlog("syslog实验A--错误",LOG_CONS|LOG_PID,LOG_LOCAL0);/*openlog函数中的第1个参数为
ident,该参数常用来表示信息的来源。ident指向的字符信息会被固定地添加在每行日志的前面。第2个参数option用于指定openlog函数
和接下来调用的syslog函数的控制标志。第3个参数为facility*/
for(i=0;i<3;i++)
syslog(LOG_ERR,"添加实验A的第%d条错误记录。/n",i);/*第一个参数是消息的紧急级别,第二个参数是消息的格式,之后是格式对应的参数。就是printf函数一样使用。*/
closelog();
/************ 添加第二段错误记录 ************/
openlog("syslog实验B--警告",LOG_CONS|LOG_PID,LOG_LOCAL1);
for(i=0;i<2;i++)
syslog(LOG_WARNING,"添加实验B的第%d条警告记录。/n",i);
closelog();
return 0;
}=================================================
程
序运行后终端没有什么反应,但是用tail /var/log/syslog查看的话(需要root权限),可以看到后面添加了以下五行:Mar 31
18:38:54 admin-desktop syslog实验A--错误[10369]: 添加实验A的第0条错误记录。
Mar 31 18:38:54 admin-desktop syslog实验A--错误[10369]: 添加实验A的第1条错误记录。
Mar 31 18:38:54 admin-desktop syslog实验A--错误[10369]: 添加实验A的第2条错误记录。
Mar 31 18:38:54 admin-desktop syslog实验B--警告[10369]: 添加实验B的第0条警告记录。
Mar 31 18:38:54 admin-desktop syslog实验B--警告[10369]: 添加实验B的第1条警告记录。
这方面的资料比较多,可以参看以下文章:http://book.csdn.net/bookfiles/545/10054518311.shtml
http://www.sudu.cn/info/html/edu/20060101/297778.html http://blog.csdn.net/yulanarti/archive/2007/09/13/1783839.aspx上面程序中标为蓝色的注释也是在网上的文章中摘过来的。
=========================================
然后再进行在Android上写日志文件的实验,但是把这个程序编译到Android上,运行之后却找不到日志写到什么地方去了。Android下没有
var目录,而且用logcat查看后也发现自己的信息没有加入到日志中。后来在网上找了一下资料,又回想了源码中的一些情景,试着用了LOGD来输出信
息到日志,果然成功了。现把代码贴到下面:/********************** log.c
*************************/
#include <jni.h>
#include <utils/Log.h>
int main()
{
LOGD("调试信息!!!!!!!!!!/n");
return 0;
}
/********************** Android.mk *************************/
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)LOCAL_SRC_FILES:= /
log.cLOCAL_SHARED_LIBRARIES := /
libutils /#如果没有下面这一行,将提示jni.h找不到(error: jni.h: No such file or directory)
LOCAL_C_INCLUDES := /
$(JNI_H_INCLUDE)LOCAL_PRELINK_MODULE := falseLOCAL_MODULE:= syslog_test
include $(BUILD_EXECUTABLE)===========================
然后编译运行,使用logcat就可以看到我们写的那行信息。D/ ( 191): 调试信息!!!!!!!!!!4月1日补充:
用C语言并不是只有LOGD一种方式可以将信息写入日志,查阅android源码
/system
/core/include/cutils/log.h中的代码后得知,还有其他几种基本的宏,如LOGE、LOGV、LOGI、LOGW等,它们的使用
场合是有差别的,关于这点,源码中是这样注释的。LOGV:Simplified macro to send a verbose log
message using the current LOG_TAG
LOGD:Simplified macro to send a debug log message using the current LOG_TAG.
LOGI:Simplified macro to send an info log message using the current LOG_TAG.
LOGW:Simplified macro to send a warning log message using the current LOG_TAG.
LOGE:Simplified
macro to send an error log message using the current
LOG_TAG.可见,LOG后面的字母就是它们输出信息种类的单词的首字母。关于这几个宏的详细使用场合可参看这篇文章()。里面介绍的比较详细,是用
java语言举的例子。如果想在C语言程序中调用这几个宏,可以参考本文中的例子。对昨天写的log.c作如下修改,将5个宏都添加进去。
/********************** log.c *************************/
#include <jni.h>
#include <utils/Log.h>
int main()
{
LOGD("调试!!!!!!!!!!/n");
LOGE("出错!!!!!!!!!!/n");
LOGV("详述!!!!!!!!!!/n");
LOGI("消息!!!!!!!!!!/n");
LOGW("警告!!!!!!!!!!/n");
return 0;
}
编译运行后,有一个比较奇怪的现象,就是LOGV没有输出到logcat,其他四个都有输出,这个还没弄明白是为什么。
////////////////////////// 程序运行结果(使用logcat查看)
////////////////////////////
D/ ( 193): 调试!!!!!!!!!!
E/ ( 193): 出错!!!!!!!!!!
I/ ( 193): 消息!!!!!!!!!!
W/ ( 193): 警告!!!!!!!!!!从logcat的每条信息前面的字母也可以看出,D、E、I、W分别对应的是调试、出错、消息、警告。
日志。首先是在Linux中尝试写系统日志,关于这方面的资料网上已经很多了,我先把我的代码贴到下面吧。
/****************************** syslog.c
***********************************/
#include<stdio.h>
#include<stdlib.h>
#include<syslog.h>
int main()
{
int i;
/************ 添加第一段错误记录 ************/
/*openlog函数用于打开系统日志连接,调用openlog是可选择的。如果不调用openlog,则在第一次调用syslog时,自动调用
openlog。调用openlog 使我们可以指定一个ident,以后, 此ident 将被加至每则记录消息中。ident
一般是程序的名称(例如 ,cron ,ine 等)*/
openlog("syslog实验A--错误",LOG_CONS|LOG_PID,LOG_LOCAL0);/*openlog函数中的第1个参数为
ident,该参数常用来表示信息的来源。ident指向的字符信息会被固定地添加在每行日志的前面。第2个参数option用于指定openlog函数
和接下来调用的syslog函数的控制标志。第3个参数为facility*/
for(i=0;i<3;i++)
syslog(LOG_ERR,"添加实验A的第%d条错误记录。/n",i);/*第一个参数是消息的紧急级别,第二个参数是消息的格式,之后是格式对应的参数。就是printf函数一样使用。*/
closelog();
/************ 添加第二段错误记录 ************/
openlog("syslog实验B--警告",LOG_CONS|LOG_PID,LOG_LOCAL1);
for(i=0;i<2;i++)
syslog(LOG_WARNING,"添加实验B的第%d条警告记录。/n",i);
closelog();
return 0;
}=================================================
程
序运行后终端没有什么反应,但是用tail /var/log/syslog查看的话(需要root权限),可以看到后面添加了以下五行:Mar 31
18:38:54 admin-desktop syslog实验A--错误[10369]: 添加实验A的第0条错误记录。
Mar 31 18:38:54 admin-desktop syslog实验A--错误[10369]: 添加实验A的第1条错误记录。
Mar 31 18:38:54 admin-desktop syslog实验A--错误[10369]: 添加实验A的第2条错误记录。
Mar 31 18:38:54 admin-desktop syslog实验B--警告[10369]: 添加实验B的第0条警告记录。
Mar 31 18:38:54 admin-desktop syslog实验B--警告[10369]: 添加实验B的第1条警告记录。
这方面的资料比较多,可以参看以下文章:http://book.csdn.net/bookfiles/545/10054518311.shtml
http://www.sudu.cn/info/html/edu/20060101/297778.html http://blog.csdn.net/yulanarti/archive/2007/09/13/1783839.aspx上面程序中标为蓝色的注释也是在网上的文章中摘过来的。
=========================================
然后再进行在Android上写日志文件的实验,但是把这个程序编译到Android上,运行之后却找不到日志写到什么地方去了。Android下没有
var目录,而且用logcat查看后也发现自己的信息没有加入到日志中。后来在网上找了一下资料,又回想了源码中的一些情景,试着用了LOGD来输出信
息到日志,果然成功了。现把代码贴到下面:/********************** log.c
*************************/
#include <jni.h>
#include <utils/Log.h>
int main()
{
LOGD("调试信息!!!!!!!!!!/n");
return 0;
}
/********************** Android.mk *************************/
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)LOCAL_SRC_FILES:= /
log.cLOCAL_SHARED_LIBRARIES := /
libutils /#如果没有下面这一行,将提示jni.h找不到(error: jni.h: No such file or directory)
LOCAL_C_INCLUDES := /
$(JNI_H_INCLUDE)LOCAL_PRELINK_MODULE := falseLOCAL_MODULE:= syslog_test
include $(BUILD_EXECUTABLE)===========================
然后编译运行,使用logcat就可以看到我们写的那行信息。D/ ( 191): 调试信息!!!!!!!!!!4月1日补充:
用C语言并不是只有LOGD一种方式可以将信息写入日志,查阅android源码
/system
/core/include/cutils/log.h中的代码后得知,还有其他几种基本的宏,如LOGE、LOGV、LOGI、LOGW等,它们的使用
场合是有差别的,关于这点,源码中是这样注释的。LOGV:Simplified macro to send a verbose log
message using the current LOG_TAG
LOGD:Simplified macro to send a debug log message using the current LOG_TAG.
LOGI:Simplified macro to send an info log message using the current LOG_TAG.
LOGW:Simplified macro to send a warning log message using the current LOG_TAG.
LOGE:Simplified
macro to send an error log message using the current
LOG_TAG.可见,LOG后面的字母就是它们输出信息种类的单词的首字母。关于这几个宏的详细使用场合可参看这篇文章()。里面介绍的比较详细,是用
java语言举的例子。如果想在C语言程序中调用这几个宏,可以参考本文中的例子。对昨天写的log.c作如下修改,将5个宏都添加进去。
/********************** log.c *************************/
#include <jni.h>
#include <utils/Log.h>
int main()
{
LOGD("调试!!!!!!!!!!/n");
LOGE("出错!!!!!!!!!!/n");
LOGV("详述!!!!!!!!!!/n");
LOGI("消息!!!!!!!!!!/n");
LOGW("警告!!!!!!!!!!/n");
return 0;
}
编译运行后,有一个比较奇怪的现象,就是LOGV没有输出到logcat,其他四个都有输出,这个还没弄明白是为什么。
////////////////////////// 程序运行结果(使用logcat查看)
////////////////////////////
D/ ( 193): 调试!!!!!!!!!!
E/ ( 193): 出错!!!!!!!!!!
I/ ( 193): 消息!!!!!!!!!!
W/ ( 193): 警告!!!!!!!!!!从logcat的每条信息前面的字母也可以看出,D、E、I、W分别对应的是调试、出错、消息、警告。
相关文章推荐
- [如何控制Log 1]分别在Linux和Android中用C语言写系统日志
- 在Linux和Android中用C语言写系统日志
- 在Linux和Android中用C语言写系统日志
- Linux中用C语言写系统日志
- Linux中用C语言写系统日志
- Linux中用C语言写系统日志
- Linux中用C语言写系统日志
- Linux系统日志分析的基本教程
- iConvert Icons 图标转换生成利器,支持Windows, Mac OS X, Linux, iOS,和Android等系统
- linux 查看用户信息、系统日志信息等命令
- Android应用程序框架层和系统运行库层日志系统源代码分析
- Android之linux之基础建设之窗口系统
- 如何在64位的linux系统上使用汇编和C语言混合编程-32汇编移植64位系统
- Android 多线程系统概述及与Linux系统的关系
- 启动一个服务监控android系统的打印日志--实现卸载软件提示
- android系统日志的输出方式
- 从读手册开始让zynq板卡跑起linux(二)----利用initrd和initramfs分别制作根文件系统
- Linux系统中如何查看日志信息
- Android日志系统Logcat源代码简要分析
- linux系统安全(二): 日志