因为需要所以尝试,在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:= += \
#
LOCAL_CFLAGS += $(common_CFLAGS)
LOCAL_SHARED_LIBRARIES += \
#
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
LOCAL_SRC_FILES := libsyslog_our_project.c
LOCAL_C_INCLUDES:= += \
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:= += \
LOCAL_CFLAGS += $(common_CFLAGS)
LOCAL_SHARED_LIBRARIES += \
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[] )
{
}
D:\ourproject\gensyslog\gensyslog_our_project.c
#include
int main( int argc, char * argv[] )
{
};
D:\ourproject\gensyslog\libsyslog_our_project.c
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define
static int
static int
static int
static const char *LogTag = "syslog";
static int
void syslog_our_project(int pri, const char *fmt, ...)
{
}
void syslog(int pri, const char *fmt, ...)
{
}
void vsyslog(pri, fmt, ap)
{