美文网首页
一个协助调试的日志头文件

一个协助调试的日志头文件

作者: andyzyao | 来源:发表于2017-06-02 11:28 被阅读0次

在平时调试ceph代码的时候,gdb并不是特别的好用,尤其是在业务逻辑比较复杂的时候,这时候最好能加上日志,原生的ceph日志特别多,不方便,这时候,一个简单的日志头文件就可以帮我们增加额外的我们自己感兴趣的日志。

下面这个日志头文件,只有包含这个头文件就可以了。使用的方法如下:

LOG(INFO) << "Hello World!" << std::endl;

或者使用C语言的打印的格式

LOG_MESSAGE("Hello %s\n", name.c_str());

日志头文件完整的源代码如下:

#ifndef LOG_MESSAGE_H
#define LOG_MESSAGE_H

#include <stdint.h>
#include <stdio.h>
#include <time.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
#include <pthread.h>
#include <sys/syscall.h>   /* For SYS_xxx definitions */
#include <iostream>
#include <sstream>

#define LOG_MESSAGE(format, ...)                                                                \
    do {                                                                                        \
        FILE* ffff = fopen("/tmp/debug.log", "a");                                              \
        if (ffff == NULL) {                                                                     \
            break;                                                                              \
        }                                                                                       \
        struct timeval tv = {0};                                                                \
        struct tm tm = {0};                                                                     \
        gettimeofday(&tv, NULL);                                                                \
        localtime_r(&(tv.tv_sec), &tm);                                                         \
        fprintf(ffff, "[%d-%02d-%02d %02d:%02d:%02d.%03d][%d:%d][%s:%d] " format "\n",          \
                1900 + tm.tm_year, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec, \
                static_cast<int>(tv.tv_usec / 1000),                                            \
                static_cast<int>(getpid()), static_cast<int>(syscall(SYS_gettid)),              \
                __FILE__, __LINE__,                                                             \
                ##__VA_ARGS__);                                                                 \
        fclose(ffff);                                                                           \
    } while (false)

class LogMessage {
public:
    LogMessage(const char* file, int line) {
        Init(file, line);
    }

    ~LogMessage() {
        FILE* fp = fopen("/tmp/debug.log", "a");
        if (fp == NULL) {
            return;
        }
        fprintf(fp, "%s\n", stream_.str().c_str());
        fclose(fp);
    }

    std::ostream& stream() { return stream_; }

private:
    void Init(const char* file, int line) {
        char buf[256] = {0};
        struct timeval tv = {0};
        struct tm tm = {0};
        gettimeofday(&tv, NULL);
        localtime_r(&(tv.tv_sec), &tm);
        sprintf(buf, "[%d-%02d-%02d %02d:%02d:%02d.%03d][%d:%d][%s:%d] ",
                1900 + tm.tm_year, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec,
                static_cast<int>(tv.tv_usec / 1000),
                static_cast<int>(getpid()), static_cast<int>(syscall(SYS_gettid)),
                file, line);
        stream_ << buf;
    }

    std::ostringstream stream_;
};

#define LOG(INFO) LogMessage(__FILE__, __LINE__).stream()

#endif // LOG_MESSAGE_H

相关文章

  • 一个协助调试的日志头文件

    在平时调试ceph代码的时候,gdb并不是特别的好用,尤其是在业务逻辑比较复杂的时候,这时候最好能加上日志,原生的...

  • Java Core Dump分析过程

    [hs_err_pid]文件:Java 虚拟机崩溃日志 这次是如何分析问题的? 一、首先查看日志头文件 日志头文件...

  • Flutter 调试方式

    在 Flutter 里有几种调试方式。 断点调试。 debugger 调试。 rendering 调试。 日志调试...

  • 调试iPhone越狱手机app

    调试可以用 Monkeydev (可调试 hook 、class-dump头文件、重签名等) CrackerXI、...

  • JavaScript 忍者秘籍笔记——利用测试和调试武装自己

    第二章 利用测试和调试武装自己 调试代码 调试 javascript 有两个重要的方法:日志记录和断点 日志记录 ...

  • Android Studio调试

    参考 断点调试 实用调试 总结:断点调试有step into step out 等 实用调试:条件断点、日志断点、...

  • Nginx如何对日志文件进行配置?

    在我们日常工作开发中,对调试bug最重要的手段就是查看日志和断点调试了。今天我们来说日志文件,Nginx的日志文件...

  • 调试和日志

    调试和日志 [TOC] 1.Trace调试 2.调试模式 3.输出调试 dump(); 自动换行?...

  • java debug 体系分析

    作为一个程序员,每天都会遇到问题、调试代码。常见的调试一般是加日志、打断点。在java中添加日志,每次都要编译,极...

  • 【坑】winsock2.h和windows.h的include顺

    给qt工程添加一个日志模块,该模块只有一个头文件,顺手就把这个头文件放在cpp的顶部include了,结果一编译出...

网友评论

      本文标题:一个协助调试的日志头文件

      本文链接:https://www.haomeiwen.com/subject/hxtufxtx.html