移植zlog到openwrt

下载编译zlog

根据代码工程,增加Makefile,路径代码顶层目录下:package/libs/zlog/Makefile,会在dl目录下下载指定的zlog安装包,然后解压到指定路径编译会生成库文件,主要检查生成的库文件是否进入安装目录

#                                                                                                                                                                                                           
# Copyright (C) 2010-2016 OpenWrt.org
#
# This is free software, licensed under the GNU General Public License v2.
# See /LICENSE for more information.
#

include $(TOPDIR)/rules.mk

PKG_NAME:=zlog
PKG_VERSION:=1.2.15
PKG_RELEASE:=$(AUTORELEASE)

#PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)

PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=\
  https://github.com/HardySimpson/zlog/archive/refs/tags/$(PKG_NAME)
PKG_HASH:=00037ab8d52772a95d645f1dcfd2c292b7cea326b54e63e219a5b7fdcb7e6508

#PKG_INSTALL:=1
PKG_BUILD_PARALLEL:=1

include $(INCLUDE_DIR)/package.mk

define Package/zlog
  SECTION:=libs
  CATEGORY:=Libraries
  TITLE:=zlog
  DEPENDS:=+libpthread 
endef

define Package/zlog/description
  libzlog .
endef
define Package/zlog/install
    $(INSTALL_DIR) $(1)/usr/include
    $(CP) $(PKG_BUILD_DIR)/src/zlog.h $(1)/usr/include/
    
    $(INSTALL_DIR) $(1)/usr/lib
    $(CP) $(PKG_BUILD_DIR)/src/libzlog.* $(1)/usr/lib/
    $(CP) $(PKG_BUILD_DIR)/src/libzlog.* $(TOOLCHAIN_DIR)/lib/
endef

$(eval $(call BuildPackage,zlog))

封装代码

ERROR_PRINTF、DEBUG_PRINTF、INIT_PRINTF三个宏函数可以直接在引用程序中调用,前提是声明此头文件

#ifndef _DEBUG_H_
#define _DEBUG_H_

#ifdef __cplusplus 
extern "C"{
#endif

#include <syslog.h>

#define debug(...) _debug(__BASE_FILE__, __LINE__, __VA_ARGS__)

void _debug(const char filename[], int line, int level, const char *format, ...);

char * format_time(time_t time, char buf[64]);

#define ZLOG_ON 1

#if ZLOG_ON
#include "zlog.h"

typedef enum 
{
   DGB_OFF = 0,
   DGB_ON  = 1,
}DBG_SWITCH_E;

typedef enum 
{
    MODULE_MIN,
    MODULE_INIT,
    MODULE_DEBUG,
    MODULE_ERROR,
    MODULE_MAX
}DBG_MODULE_E;

#define ENUM_MODULE_STR(module)(\
    (module) == MODULE_INIT ? "init":\
    (module) == MODULE_DEBUG ? "debug":\
    (module) == MODULE_ERROR ? "error":\
    (module) == MODULE_MAX ? "MAX":\
    "unkown")

struct packet_dbg_cb {
    const char *  str;
    zlog_category_t * zc;
    DBG_SWITCH_E  flag;
};

#define IS_DBG_LOG_ON(value)  \
    (value>MODULE_MIN &&value<MODULE_MAX)?\
    dbg_module_table[value].flag: DGB_OFF
    
#define INIT_PRINTF(format, args... ) \
    zlog_info(dbg_module_table[MODULE_INIT].zc, " \"" format "\"", ##args)

#define DEBUG_PRINTF(format, args... ) \
    zlog_debug(dbg_module_table[MODULE_DEBUG].zc, " \"" format "\"", ##args)

#define ERROR_PRINTF(format, args... ) \
    zlog_error(dbg_module_table[MODULE_ERROR].zc, " \"" format "\"", ##args)

extern struct packet_dbg_cb dbg_module_table[MODULE_MAX];
#else
#define DEBUG_PRINTF(format, args... ) \
{ \
    time_t timep; \
    time( &timep ); \
    struct tm *pTM = gmtime( &timep ); \
    struct timeval tv; \
    gettimeofday( &tv, NULL ); \
    printf( "%4d/%02d/%02d %02d:%02d:%02d.%03d  [DBG_NB] "__FILE__":%d(%s) \"" format "\"\n", \
        pTM->tm_year+1900, pTM->tm_mon, pTM->tm_mday, pTM->tm_hour+8, pTM->tm_min, pTM->tm_sec, tv.tv_usec/1000, __LINE__, __FUNCTION__, ##args ) ; \
}
#define INIT_PRINTF(format, args... ) \
{ \
    time_t timep; \
    time( &timep ); \
    struct tm *pTM = gmtime( &timep ); \
    struct timeval tv; \
    gettimeofday( &tv, NULL ); \
    printf( "%4d/%02d/%02d %02d:%02d:%02d.%03d  [INF_NB] "__FILE__":%d(%s)__ " format " \n", \
        pTM->tm_year+1900, pTM->tm_mon, pTM->tm_mday, pTM->tm_hour+8, pTM->tm_min, pTM->tm_sec, tv.tv_usec/1000, __LINE__, __FUNCTION__, ##args ) ; \
}
#define ERROR_PRINTF(format, args... ) \
{ \
    time_t timep; \
    time( &timep ); \
    struct tm *pTM = gmtime( &timep ); \
    struct timeval tv; \
    gettimeofday( &tv, NULL ); \
    printf( "%4d/%02d/%02d %02d:%02d:%02d.%03d  [ERR_NB] "__FILE__":%d(%s)__ " format " \n", \
        pTM->tm_year+1900, pTM->tm_mon, pTM->tm_mday, pTM->tm_hour+8, pTM->tm_min, pTM->tm_sec, tv.tv_usec/1000, __LINE__, __FUNCTION__, ##args ) ; \
}

#endif

#ifdef __cplusplus
}
#endif

#endif

应用程序调用

#if ZLOG_ON
#include "zlog.h"
struct packet_dbg_cb dbg_module_table[MODULE_MAX];
#define ZLOG_CONF "/etc/log/agent.conf"

int agentLogInit(int flag)
{
    FILE * filep = fopen(ZLOG_CONF, "r");
    if (NULL == filep) {
        return 0;
    }   

    if(-1 == zlog_init(ZLOG_CONF))
        zlog_init(NULL);
    zlog_category_t *zc;

    zc = zlog_get_category("agent");
    if (!zc) {
        printf("zlog_get_category fail\n");
        zlog_fini();
        return -1; 
    }   

    int i;
    for(i = MODULE_MIN; i < MODULE_MAX; i++){
        dbg_module_table[i].zc = zc; 
        dbg_module_table[i].flag = flag;
    }   

    return 0;
}
#else
int agentLogInit(int flag)                                                                                                                                                                                  
{
    return 0;
}
#endif

int main(int argc, char *argv[])
{
    FILE *fp, *json_fp;
    char *json_out;
    cJSON *root;
    int retVal = -1; 
    char sys_cmd_1[100] = "iwlist ";
    char sys_cmd_2[50] = " scanning > /tmp/scan_output.txt";

    INIT_PRINTF("agent start ...............");
    agentLogInit(DGB_ON);
    if(argc > 2)
    {   
        ERROR_PRINTF("Usage: wlan_parser_util <interface>");
        return -1; 
    }   
    if(argv[1] == NULL)
    {   
        ERROR_PRINTF("Usage: wlan_parser_util <interface>");
        return -1; 
    }   

    strcat(sys_cmd_1, argv[1]);
    strcat(sys_cmd_1, sys_cmd_2);
                                                                                                                                                                                                            
    retVal = system(sys_cmd_1);
    DEBUG_PRINTF("Begin execute command wlan_parser_util <interface>");
}

配置文件:/etc/log/agent.conf

[formats]
simple  = "%d.%ms %m%n"
[rules]
agent.*         >stderr;
agent.*  "/etc/log/agent.log" ,2MB;

结果

每次运行应用程序会将debug信息保留到文件中,方便应用程序出现问题时候提供支撑log定位问题。
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值