/*
 * @Author: zhy
 * @Date: 2022-10-11 10:08:57
 * @LastEditors: zhanghongyang zhanghy@bmser.com
 * @Description: 
 */
#ifndef BMSER_LOG_H_
#define BMSER_LOG_H_

#include <stdio.h>
#ifdef _MSC_VER

#define dy_syslog(level, fmt, ...)   

#else    //end linux
#include <syslog.h>
#include <sys/syscall.h>
#include <sys/types.h>
#include <unistd.h>
#include <libgen.h>
#include <time.h>
#include <stdlib.h>
#include "bmser_utils.h"

#ifdef __cplusplus
extern "C" {
#endif

extern long long g_log_rate_limit;
long long get_log_rate_limit() ;
#define dy_syslog(level, fmt, ...)                                          \
    do                                                                      \
    {                                                                       \
        static long long logTimeStamp_##__LINE__ = 0;                        \
        long long * p_logTimeStamp = &logTimeStamp_##__LINE__;                \
        long long currentTime = bmser_clocke_get_time_monotonic_ms();                    \
        long long log_rate_limit = get_log_rate_limit();           \
        if(level == LOG_ERR){log_rate_limit = 10000;}     \
        if(currentTime - *p_logTimeStamp >= log_rate_limit) {              \
            char __buf[4096] = {0};                                             \
            snprintf(__buf, sizeof(__buf), fmt, ##__VA_ARGS__);                 \
            syslog(LOG_USER | level, "pid:%d %s:%d %s", getpid(), basename((char*)__FILE__), __LINE__, __buf); \
            *p_logTimeStamp = currentTime;                                  \
        }                                                                   \
    } while (0)

/**
 * @brief       !!!该接口项目专用!!!,只支持LOG_INFO LOG_ERR 两个级别，其余级别传入会被强制转换
 *              其中ERR级别会被强制限速至1min/次
 *                  INGO级别不会被限速
 * @par         修改日志:
 * Date                Author     Description           \n
 * 2024-10-31           JHC        创建初始版本          \n
*/
#define prj_syslog(level, fmt, ...)                                          \
    do                                                                      \
    {                                                                       \
        static long long logTimeStamp_##__LINE__ = 0;                        \
        int log_level = LOG_INFO;                      \
        if(level <= LOG_ERR ){log_level = LOG_ERR;}                 \
        long long * p_logTimeStamp = &logTimeStamp_##__LINE__;                \
        long long currentTime = bmser_clocke_get_time_monotonic_ms();                    \
        long long log_rate_limit = 0; \
        if(log_level == LOG_ERR){log_rate_limit = 60000;}     \
        if(currentTime - *p_logTimeStamp >= log_rate_limit) {              \
            char __buf[4096] = {0};                                             \
            snprintf(__buf, sizeof(__buf), fmt, ##__VA_ARGS__);                 \
            syslog(LOG_LOCAL0 | log_level, "pid:%d %s:%d %s", getpid(), basename((char*)__FILE__), __LINE__, __buf); \
            *p_logTimeStamp = currentTime;                                  \
        }                                                                   \
    } while (0)

#ifdef __cplusplus
}
#endif
#endif //end linux

#endif
