173 lines
3.3 KiB
C
173 lines
3.3 KiB
C
|
/** @file log.c
|
|||
|
@brief ϵͳ<EFBFBD><EFBFBD>־<EFBFBD>ӿ<EFBFBD><EFBFBD>ļ<EFBFBD>
|
|||
|
@details ʵ<EFBFBD>ֱ<EFBFBD><EFBFBD>ش<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־<EFBFBD>͵<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̨<EFBFBD><EFBFBD>־<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
@version 1.0.0
|
|||
|
@author HuangXin
|
|||
|
@date 2012-11-20
|
|||
|
@copyright Synway
|
|||
|
*/
|
|||
|
|
|||
|
#include <linux/slab.h>
|
|||
|
#include <linux/time.h>
|
|||
|
#include <linux/rtc.h>
|
|||
|
#include "log.h"
|
|||
|
|
|||
|
#ifndef NULL
|
|||
|
#define NULL (0)
|
|||
|
#endif
|
|||
|
|
|||
|
#ifndef TRUE
|
|||
|
#define TRUE (1)
|
|||
|
#endif
|
|||
|
|
|||
|
#ifndef FALSE
|
|||
|
#define FALSE (0)
|
|||
|
#endif
|
|||
|
|
|||
|
static int g_iMinLevel = LOG_All;
|
|||
|
|
|||
|
/**
|
|||
|
* @brief Log <EFBFBD><EFBFBD><EFBFBD>Եȼ<EFBFBD>ת<EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD>
|
|||
|
* @param level <EFBFBD><EFBFBD><EFBFBD>Եȼ<EFBFBD>
|
|||
|
* @return <EFBFBD><EFBFBD><EFBFBD>Եȼ<EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD>
|
|||
|
*/
|
|||
|
static const char* LogLevelToStr(LOG_LEVEL level)
|
|||
|
{
|
|||
|
switch(level)
|
|||
|
{
|
|||
|
case LOG_Test:
|
|||
|
return "T";
|
|||
|
|
|||
|
case LOG_Info:
|
|||
|
return "I";
|
|||
|
|
|||
|
case LOG_Debug:
|
|||
|
return "D";
|
|||
|
|
|||
|
case LOG_Warn:
|
|||
|
return "W";
|
|||
|
|
|||
|
case LOG_Error:
|
|||
|
return "E";
|
|||
|
|
|||
|
case LOG_Fatal:
|
|||
|
return "F";
|
|||
|
|
|||
|
case LOG_Unknown:
|
|||
|
return "U";
|
|||
|
|
|||
|
default:
|
|||
|
return "U";
|
|||
|
}
|
|||
|
|
|||
|
return "U";
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* @brief <EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD><EFBFBD>Եȼ<EFBFBD>
|
|||
|
* @param level <EFBFBD><EFBFBD><EFBFBD>Եȼ<EFBFBD>
|
|||
|
* @param iEnable 1 <EFBFBD><EFBFBD><EFBFBD>Եȼ<EFBFBD><EFBFBD><EFBFBD> 0 <EFBFBD>رյ<EFBFBD><EFBFBD>Եȼ<EFBFBD>
|
|||
|
*/
|
|||
|
void HD_EnableLogLevel(LOG_LEVEL level, int iEnable)
|
|||
|
{
|
|||
|
if(iEnable > 0)
|
|||
|
{
|
|||
|
g_iMinLevel |= level;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
g_iMinLevel &= ~(level);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* @brief <EFBFBD><EFBFBD>ʽ<EFBFBD><EFBFBD> Log<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Log<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
|
|||
|
* @details <EFBFBD><EFBFBD> Log <EFBFBD>м<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>䣬<EFBFBD><EFBFBD><EFBFBD>Եȼ<EFBFBD><EFBFBD>ȸ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
|
|||
|
* @param cFlag <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
* @param pMsg <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
* @param dt Log <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>
|
|||
|
*/
|
|||
|
static void HD_LinuxPrintf(LOG_LEVEL level, struct tm* dt, const char* pMsg)
|
|||
|
{
|
|||
|
char* pDebugMsg = (char*)kmalloc(strlen(pMsg) + 64, GFP_KERNEL);
|
|||
|
|
|||
|
if(pDebugMsg == NULL)
|
|||
|
{
|
|||
|
printk("Log Malloc Memory Error\n");
|
|||
|
printk("%s", pMsg);
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
sprintf(pDebugMsg, "[%02d:%02d:%02d:%03d] [%s] %s",
|
|||
|
dt->tm_hour, dt->tm_min, dt->tm_sec, dt->tm_yday,
|
|||
|
LogLevelToStr(level), pMsg);
|
|||
|
|
|||
|
printk(pDebugMsg);
|
|||
|
|
|||
|
kfree(pDebugMsg);
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
|
|||
|
* @details <EFBFBD><EFBFBD><EFBFBD><EFBFBD> \a cFlag <EFBFBD>ĵȼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ \a pMsg
|
|||
|
* @param cFlag <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
* @param pMsg <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
*/
|
|||
|
static void HD_PRINTF(LOG_LEVEL level, const char* pMsg)
|
|||
|
{
|
|||
|
struct timeval tv;
|
|||
|
struct tm wtm;
|
|||
|
|
|||
|
do_gettimeofday(&tv);
|
|||
|
|
|||
|
time_to_tm(tv.tv_sec, 0, &wtm);
|
|||
|
wtm.tm_yday = tv.tv_usec / 1000;
|
|||
|
|
|||
|
HD_LinuxPrintf(level, &wtm, pMsg);
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
|
|||
|
* @param cFlag <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
* @param pMsg <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
*/
|
|||
|
void HD_LOG(LOG_LEVEL level, const char* pMsg, ...)
|
|||
|
{
|
|||
|
__builtin_va_list arg_ptr;
|
|||
|
int iMsgLen = 0;
|
|||
|
char buf[512];
|
|||
|
char* pMsgBuf = NULL;
|
|||
|
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Եȼ<D4B5>
|
|||
|
if(!(g_iMinLevel & level))
|
|||
|
{
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
memset(buf, 0, sizeof(buf));
|
|||
|
|
|||
|
va_start(arg_ptr, pMsg);
|
|||
|
iMsgLen = __builtin_vsnprintf(buf, sizeof(buf), pMsg, arg_ptr);
|
|||
|
va_end(arg_ptr);
|
|||
|
|
|||
|
if(iMsgLen > sizeof(buf))
|
|||
|
{
|
|||
|
pMsgBuf = (char*)kmalloc(iMsgLen + 1, GFP_KERNEL);
|
|||
|
|
|||
|
if(pMsgBuf == NULL)
|
|||
|
{
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
va_start(arg_ptr, pMsg);
|
|||
|
iMsgLen = __builtin_vsnprintf(pMsgBuf, iMsgLen + 1, pMsg, arg_ptr);
|
|||
|
va_end(arg_ptr);
|
|||
|
HD_PRINTF(level, pMsgBuf);
|
|||
|
kfree(pMsgBuf);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
HD_PRINTF(level, buf);
|
|||
|
}
|
|||
|
}
|