Android中添加syslog功能


因为需要所以尝试,在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源代码分析
    http://blog.csdn.net/luoshengyang/article/details/6595744

2. Android应用程序框架层和系统运行库层日志系统源代码分析
    http://blog.csdn.net/luoshengyang/article/details/6598703

3. 通过syslog接收远程日志
    http://blog.sina.com.cn/s/blog_48eef8410100izuw.html

----------这是漂亮的分割线--------------

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功能)