因为需要所以尝试,在Android中添加syslog功能
已知:
Android中
1. C库提供syslog函数,它将字符串写入/dev/kmsg中,这是个字符设备。
2. 任何输出到/dev/kmsg的信息,都作为内核的日志处理,通过dmsg查看(网上文章是这样写的,未验证)。
3. 用于日志功能的三个字符设备 main、events、radio,都在/dev/log/目录中。
4. logcat使用这三个字符设备,作为Android系统的日志管理功能的一部分。
SYSV Linux中
1. C库提供syslog函数,它将字符串写入/dev/log中,这是一个socket接口。
2. 类似sysklogd、rsyslog、syslogd、syslog-ng等服务程序都使用/dev/log获取信息。
3. 以上日志服务将从/dev/log获取的字符串,保存到文件中或者打印到终端,或者发送到远程服务器中。
4. 日志服务也能从网络获取日志信息,这是它通常被叫做远程日志服务器,并保存到文件中或者再转发到远程服务器。
于是可知,SYSV Linux日志系统与Android的日志系统不兼容,必须解决/dev/log冲突的问题。
解决办法是在Android里面建立/dev/log/log,
1. 这样不会影响原来的Android的日志系统。
2. syslogd将作为一个相对独立的应用软件运行,避免与Android系统有过多关联
3. 在Android中添加一个独立的库,提供类似Linux C库中的syslog同名函数;
4. 实践中发现,当新添加的syslog函数与Linux C库中的函数重名的时候,一定会调用新添加的(理论上应是随机的)
5. 第三方日志软件(如log4c)可以直接使用/dev/log/log来记录日志
6. 毕竟在目前的应用场景下,要使用syslog类的服务器软件还都是从Linux移植来的应用系统。
故
1. 修改启动sysklogd参数,使其避开冲突 syslogd -p /dev/log/log
2. 仿照syslog.c(来源于sysklog开源软件)编写一个系统库,专门为应用程序提供写/dev/log/log的能力
3. 再仿照syslog.c(来源于sysklog开源软件)编写一个测试程序,即可验证即可。
参考资料:
1. Android日志系统驱动程序Logger源代码分析
2. Android应用程序框架层和系统运行库层日志系统源代码分析
3. 通过syslog接收远程日志
----------这是漂亮的分割线--------------
D:\ourproject\gensyslog\Android.mk
# Porting Automake to NDK
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES := gensyslog.c
LOCAL_C_INCLUDES:= += \
# external/expat/lib/
LOCAL_CFLAGS += $(common_CFLAGS)
LOCAL_SHARED_LIBRARIES += \
# libexpat
LOCAL_MODULE:= gensyslog
LOCAL_MODULE_TAGS:=eng
LOCAL_PRELINK_MODULE := false
include $(BUILD_EXECUTABLE)
#include $(BUILD_SHARED_LIBRARY)
#############################################
include $(CLEAR_VARS)
LOCAL_COPY_HEADERS_TO := libsyslog_our_project
LOCAL_COPY_HEADERS := \
libsyslog_our_project.h
LOCAL_SRC_FILES := libsyslog_our_project.c
LOCAL_C_INCLUDES:= += \
libsyslog_our_project.h
LOCAL_CFLAGS += $(common_CFLAGS)
LOCAL_SHARED_LIBRARIES += \
LOCAL_MODULE:= libsyslog_our_project
LOCAL_MODULE_TAGS:=eng
LOCAL_PRELINK_MODULE := false
include $(BUILD_SHARED_LIBRARY)
#############################################
include $(CLEAR_VARS)
LOCAL_SRC_FILES := gensyslog_our_project.c
LOCAL_C_INCLUDES:= += \
libsyslog_our_project.h
LOCAL_CFLAGS += $(common_CFLAGS)
LOCAL_SHARED_LIBRARIES += \
libsyslog_our_project
LOCAL_MODULE:= gensyslog_our_project
LOCAL_MODULE_TAGS:=eng
LOCAL_PRELINK_MODULE := false
include $(BUILD_EXECUTABLE)
D:\ourproject\gensyslog\gensyslog.c
#include
#include
#include
int main( int argc, char * argv[] )
{
//openlog( argv[0], LOG_CONS | LOG_PID | LOG_USER );
int * p;
srand((int)p);
int count = 0;
while( count <5 )
{
syslog( LOG_NDELAY | LOG_USER | LOG_SYSLOG | LOG_INFO | LOG_ERR,
"[syslog test %d :: %.10d]", count, rand() );
printf( "[syslog test %d :: %.10d]\n", count, rand() );
++count;
}
//closelog();
return 0;
}
D:\ourproject\gensyslog\gensyslog_our_project.c
#include
int main( int argc, char * argv[] )
{
syslog( LOG_USER, "HHHHHHHHHHHHHHHHH syslog");
syslog_our_project(LOG_USER, "HHHHHHHHHHHHHHHHH syslog_our_project");
return 0;
};
D:\ourproject\gensyslog\libsyslog_our_project.c
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define _PATH_LOGNAME "/dev/log/log"
static int LogFile = -1;
static int connected;
static int LogStat = 0;
static const char *LogTag = "syslog";
static int LogFacility = LOG_USER;
void syslog_our_project(int pri, const char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
vsyslog(pri, fmt, ap);
va_end(ap);
}
void syslog(int pri, const char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
vsyslog(pri, fmt, ap);
va_end(ap);
}
void vsyslog(pri, fmt, ap)
int pri;
const char *fmt;
va_list ap;
{
register int cnt;
register char *p;
time_t now;
int fd, saved_errno;
int result;
char tbuf[2048], fmt_cpy[1024], *stdp = (char *) 0;
saved_errno = errno;
if (!LOG_MASK(LOG_PRI(pri)) || (pri &~ (LOG_PRIMASK|LOG_FACMASK)))
return;
if (LogFile < 0 || !connected)
openlog(LogTag, LogStat | LOG_NDELAY, LogFacility);
if ((pri & LOG_FACMASK) == 0)
pri |= LogFacility;
(void)time(&now);
(void)sprintf(tbuf, "
android syslog android syslog移植
转载本文章为转载内容,我们尊重原作者对文章享有的著作权。如有内容错误或侵权问题,欢迎原作者联系我们进行内容更正或删除文章。

提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
syslog 配置和使用(非syslog服务)
syslog 配置和使用
syslog 优先级 选择符 守护进程