一个简单的调试日志功能

#ifndef LOGDEBUG_H
#define LOGDEBUG_H

#include <windows.h>

void SetDebugLogParam(BOOL bOut2File,BOOL bOut2Debugstring ,BOOL bOut2Console, BOOL bWithDateTime );
void WriteDebugLog(DWORD dwLastError, LPCSTR file, LPCSTR function, int codeLine, LPCTSTR content, ...);
#define Debug(fmt, ...) WriteDebugLog(::GetLastError(), __FILE__,__FUNCTION__, __LINE__, fmt, __VA_ARGS__)

#endif
#include "LogDebug.h"
#include <tchar.h>
#include <stdio.h>
#include "Unitls.h"

#define ODS_LOG_MAXLENGTH 512

BOOL gbOut2Console = TRUE ;
BOOL gbOut2File = TRUE ;
BOOL gbOut2OutDebugstr = TRUE ;
BOOL gbWithDateTime = FALSE ;

void WriteDebugLog( DWORD dwLastError, LPCSTR file,LPCSTR function, int codeLine, LPCTSTR content, ... )
{
    TCHAR logContent[ODS_LOG_MAXLENGTH + 1] = {0};

    DWORD dwThreadID = ::GetCurrentThreadId();

    WCHAR wszTm[MAX_PATH];
    SYSTEMTIME sytm;
    GetLocalTime(&sytm);
    _stprintf_s(wszTm,L" %04d%02d%02d-%02d%02d%02d",sytm.wYear,sytm.wMonth,sytm.wDay,sytm.wHour,sytm.wMinute,sytm.wSecond);

    LPWSTR lpwszFile = UTF8_2_UTF16((LPSTR)file);
    LPWSTR lpwszFunction = UTF8_2_UTF16((LPSTR)function);
    int iWritten = _stprintf_s(logContent, _T("Debug [%s %s:%d] %u "), lpwszFile,lpwszFunction, codeLine, dwThreadID);
    zFree((LPBYTE)lpwszFile);
    zFree((LPBYTE)lpwszFunction);
    va_list ap;
    va_start(ap, content);
    _vsntprintf_s(logContent + iWritten, ODS_LOG_MAXLENGTH - iWritten, _TRUNCATE, content, ap);
    va_end(ap);

    if (dwLastError != 0)
    {
        TCHAR lastError[16] = {0};
        _stprintf_s(lastError, 15, _T(" E%u"), dwLastError);

        size_t len = _tcslen(logContent);
        if (len + _tcslen(lastError) < ODS_LOG_MAXLENGTH)
        {
            _tcscat_s(logContent, lastError);
        }
    }

    if (gbWithDateTime )
    {

        size_t len = _tcslen(logContent);
        if (len + _tcslen(wszTm) < ODS_LOG_MAXLENGTH)
        {
            _tcscat_s(logContent, wszTm);
        }
    }

    _tcscat_s(logContent, _T("\r\n"));
    static HANDLE hStandOut = INVALID_HANDLE_VALUE ;
    if (gbOut2Console)
    {

        if (hStandOut == INVALID_HANDLE_VALUE)
        {
            AllocConsole();
            hStandOut = GetStdHandle(STD_OUTPUT_HANDLE);

        }

        if (hStandOut != INVALID_HANDLE_VALUE)
        {
            DWORD dwWriten = 0;

            WriteConsole(hStandOut,logContent,wcslen(logContent),&dwWriten,0);

        }
    }

    if (gbOut2OutDebugstr)
    {
        OutputDebugString(logContent);
    }
    static HANDLE hOutFIle = INVALID_HANDLE_VALUE ;
    if (gbOut2File)
    {

        if (hOutFIle == INVALID_HANDLE_VALUE)
        {
            WCHAR wszFileName[MAX_PATH];

            GetModuleFileName(NULL,wszFileName,MAX_PATH);
            _tcscat_s(wszFileName,wszTm);

            _tcscat_s(wszFileName,L".debuglogs");

            hOutFIle = CreateFile(wszFileName,GENERIC_WRITE, FILE_SHARE_READ,NULL,OPEN_ALWAYS,NULL,NULL);
        }
        DWORD dwWriten = 0;
        WriteFile(hOutFIle,logContent,wcslen(logContent)*2,&dwWriten,NULL);

    }
    // #endif

}

void SetDebugLogParam(BOOL bOut2File,BOOL bOut2Debugstring ,BOOL bOut2Console, BOOL bWithDateTime)
{
    gbOut2Console = bOut2Console ;
    gbOut2File = bOut2File;
    gbOut2OutDebugstr = bOut2Debugstring ;
    gbWithDateTime = bWithDateTime ;
}

有几个函数是自己写的小工具函数,就不贴了,自己看着改改吧

时间: 2024-07-30 03:41:23

一个简单的调试日志功能的相关文章

完成一段简单的Python程序,用于实现一个简单的加减乘除计算器功能

#!/bin/usr/env python#coding=utf-8'''完成一段简单的Python程序,用于实现一个简单的加减乘除计算器功能'''try: a=int(raw_input("please input a number:"))except ValueError: print("第一个运算数字输入非数字") try: b=int(raw_input("please input another number:"))except Val

数据结构学习1:实现一个简单的线性表功能

数据结构: 一个简单的线性表的实现 学习了数据结构有一段时间了,那是半年前老师课堂上讲的,最后由于一些原因,没能听到最后,前几天在写一些算法的时候,发现自己的数据结构还是太渣了,因此便又拿起了那本很有价值的数据结构的书,重新来啃这本厚厚的书,数据结构在我们编程中是非常的重要的,希望这次的学习能有一个好的开头,并且能在这个过程中有所得吧! 下面是我写的一个简单的线性表的实现: #include"stdafx.h" #include<iostream> using namesp

通过ASP.NET MVC框架 + 原生JavaScript + Ajax + SQL SERVER 实现一个简单的有论坛功能的网站(有通过iis发布的例子)

ASP.NET MVC. M 为Model模型层, V 为View视图层, C 为Controller控制层.要想使用MVC框架来写网站就需要了解M V C 的作用分别为哪些.给大家简单的介绍一下: 1.当你的这个网站要与数据库交互的时候,你可以使用EF创建一个数据库模型,也可以用类存放你所需交互的字段数据.我们往往把这类文件放在model层. 2.view层,存放前端网页的. 3.controller层实现前端网页功能的,在这个层里面我们编写的方法称为action. www.lazyfitne

HTML DOM 事件(实现一个简单的回到顶部功能)

HTML DOM 事件允许Javascript在HTML文档元素中注册不同事件处理程序.事件通常与函数结合使用,函数不会在事件发生前被执行! (如用户点击按钮). 利用onscroll事件写一个回到顶部功能,代码如下: <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8" /> <meta name="viewport" c

web前端入门到实战:HTML DOM 事件(实现一个简单的回到顶部功能)

HTML DOM 事件允许Javascript在HTML文档元素中注册不同事件处理程序.事件通常与函数结合使用,函数不会在事件发生前被执行! (如用户点击按钮). 利用onscroll事件写一个回到顶部功能,代码如下: <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8" /> <meta name="viewport" c

Java数据实现一个简单双色球摇奖功能

双色球:从1-33号球中选取6个红球,且红球不重复 从1-16号球中选取一个篮球 话不多说 上代码~~~ package Javaee; import java.util.Arrays;import java.util.Random; public class DoubleChromosphere { public static void main(String[] args) { //定义红球池 int[] redpool = new int[33]; //添加红球数字 for (int i

python实现一个简单的爬虫搜索功能

html.parser HTMLParser   urllib.request urlopen   urllib parse LinkParser(HTMLParser):     handle_starttag(, tag, attrs):         tag == :             (key, value) attrs:                 key == :                     newUrl = parse.urljoin(.baseUrl, v

Java实现一个简单双色球摇奖功能

要求:摇出1-33之间的7个随机数,且数字不能重复 双色球用ArryList集合来存储 随机摇出双色球使用Random类nextInt()方法 @Test public void filedome17() { // 1-33之间的7个随机数,不能重复 // HashSet<Integer> list = new HashSet<>(); ArrayList<Integer> list = new ArrayList<>(); Random random =

iOS实现一个简单的扫码功能

用到的是AVFoundation 需要用到Capture,Input,Output,Session,previewLayer相关类 #import "ScanQRCodeController.h" #import <AVFoundation/AVFoundation.h> #define WIDTH [UIScreen mainScreen].bounds.size.width #define HEIGHT [UIScreen mainScreen].bounds.size