生成日志logger

16 篇文章 0 订阅

目录

一、主要解决两个问题点:

二、解决获取utc time

2.1 精确时间到ms级别,用:gettimeofday(&tv, NULL);

2.2 输出格式 ,localtime(&t)的时间是1970-00-01开始的,所以要有个转换。

2.3 返回值问题,一开始自己是char* fun(),返回值不能打印,因为szTime[] 内存出了函数就没有了。所以就用了入参的形式。

三、按照想要的顺序格式输出log

3.1有个可变参数的问题概念。

3.2那么列表表示什么呢?


本来不想造轮子,因为有很多轮子,但是学习阶段,还是都接触一下吧,自己下手实现一下。

一、主要解决两个问题点:

1、获取当前utc time;

2、按照想要的顺序格式输出log;

二、解决获取utc time

直接上代码l

2.1 精确时间到ms级别,用:gettimeofday(&tv, NULL);

因为localtime(&t)只能精确到s;

可以打开文档看下接口就明白为什么;

2.2 输出格式 ,localtime(&t)的时间是1970-00-01开始的,所以要有个转换。

2.3 返回值问题,一开始自己是char* fun(),返回值不能打印,因为szTime[] 内存出了函数就没有了。所以就用了入参的形式。

void GetUTCMs(char *result)
{
    long long utcMs = -1;
    const size_t SZTIME_SIZE = 255;
    char szTime[SZTIME_SIZE];
    //获取us单位的时间
    struct timeval tv;
    gettimeofday(&tv, NULL);
    utcMs = tv.tv_sec;
    utcMs = utcMs * 1000  + tv.tv_usec / 1000;
    
    //只要ms的时间;因为s以上的时间可以用localtime获取,少计算
    long long SECOND_DIGIT = 1000;
    long mmsec = utcMs/SECOND_DIGIT >0 ? utcMs %1000 : 0;
    
    time_t t = time(NULL);
    struct tm *tm1 = localtime(&t);//只能精确到s
    //转化格式成字符串
    snprintf( szTime, SZTIME_SIZE,
        "%4.4d-%2.2d-%2.2d %2.2d:%2.2d:%2.2d:%3.3u [%lld]",
        tm1->tm_year+1900, tm1->tm_mon+1, tm1->tm_mday,
        tm1->tm_hour, tm1->tm_min,tm1->tm_sec,mmsec, time);
    
    strncpy (result, szTime, sizeof(szTime));//copy
}

三、按照想要的顺序格式输出log

3.1有个可变参数的问题概念。

...表示可变参数(多个可变参数组成一个列表,后面有专门的指针指向他),不限定个数和类型,

还是先上代码吧:这段是将__fmt和...列表生成一个字符串

void  logPrint(const char *__fmt,...)
{
    char szTimeTemp[256];
    GetUTCMs(&szTimeTemp);//获取当前系统时间 精确到ms
    
    va_list ap;//初始化指向可变参数列表的指针
    char string[256];
    va_start(ap,__fmt);//将第一个可变参数的地址付给ap,即ap指向可变参数列表的开始
    //vsprintf()功 能: 送格式化输出串到指定数组中
    vsprintf(string,__fmt,ap);//将参数fmt、ap指向的可变参数一起转换成格式化字符串,放string数组中,其作用同sprintf(),只是参数类型不同
    printf("%s, %s",szTimeTemp,string);
//    Uart_SendString(string); //把格式化字符串从开发板串口送出去// TODO 写入文档//
    va_end(ap);    //ap付值为0,没什么实际用处,主要是为程序健壮性

}

3.2那么列表表示什么呢?

...列表是宏定义的:"[" __FILE__" %s Line#%d] " format "\n", __FUNCTION__,  __LINE__,  ##__VA_ARGS__ 这么一连串参数;

#define Lee_LOG(format,...) logPrint("[" __FILE__" %s Line#%d] " format "\n", __FUNCTION__,  __LINE__,  ##__VA_ARGS__);

 

http://blog.sina.com.cn/s/blog_9f1118490101h5dl.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Lombok并不能直接实现按日期生成日志文件的功能,但是可以通过结合使用Lombok和Logback来实现。下面是示例代码: 1. 在pom.xml中添加Lombok和Logback的依赖: ```xml <dependencies> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.20</version> <scope>provided</scope> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.3</version> </dependency> </dependencies> ``` 2. 在logback.xml中配置按日期生成日志文件: ```xml <?xml version="1.0" encoding="UTF-8"?> <configuration> <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>/path/to/logs/mylog.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- daily rollover --> <fileNamePattern>/path/to/logs/mylog-%d{yyyy-MM-dd}.log</fileNamePattern> <!-- keep 30 days' worth of history --> <maxHistory>30</maxHistory> </rollingPolicy> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{35} - %msg%n</pattern> </encoder> </appender> <root level="info"> <appender-ref ref="FILE" /> </root> </configuration> ``` 这里的`fileNamePattern`指定了生成日志文件名格式为`mylog-yyyy-MM-dd.log`,并且保留最近30天的日志文件。`encoder`中的`pattern`指定了日志输出的格式。 3. 在需要输出日志的类上使用Lombok的`@Slf4j`注解: ```java import lombok.extern.slf4j.Slf4j; @Slf4j public class MyClass { public void myMethod() { log.info("This is a log message"); } } ``` 这里使用了`@Slf4j`注解来自动生成`log`变量,可以直接使用`log`输出日志。 这样就可以在`/path/to/logs`目录下按日期生成日志文件了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值