下载编译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定位问题。