#pragma once
#include <string>
#include "StdAfx.h"
#include <Windows.h>
using std::string;
using std::wstring;
const char* g_pLogPath = "C:\\TestLog.log";
#define LOG_ENABLE //打印日志启用开关 class CSimpleLog
{
public:
CSimpleLog(void);
~CSimpleLog(void);
void Write(const char* pSourcePath, const char* pFunName, const long lLine, const char* pLogText);
void Write(const char* pSourcePath, const char* pFunName, const long lLine, const wchar_t* pLogText);
void ScanfWrite(const char* pSourcePath, const char* pFunName, const long lLine, \
const char* pLogText, ...);
void ScanfWrite(const char* pSourcePath, const char* pFunName, const long lLine, \
const wchar_t* pLogText, ...);
protected:
string GetTime();
string U2A(const wstring& str);
}; CSimpleLog g_log;
CSimpleLog::CSimpleLog(void)
{
} CSimpleLog::~CSimpleLog(void)
{
} void CSimpleLog::Write(const char* pSourcePath, const char* pFunName, \
const long lLine, const char* pLogText)
{
if (pLogText == NULL)
return;
int nLogLen = strlen(pLogText);
if (nLogLen == 0)
return;
int nSourceLen = strlen(pSourcePath);
int nFunLen = strlen(pFunName);
char szLine[10] = { 0 };
sprintf_s(szLine, "%ld", lLine);
int nLineLen = strlen(szLine);
int nSpaceLen = 80 - nSourceLen - nFunLen - nLineLen;
string strTime = GetTime();
FILE* fp = NULL;
fopen_s(&fp, g_pLogPath, "a+");
fwrite(strTime.c_str(), strTime.size(), 1, fp);
fwrite(" ", 1, 1, fp);
fwrite(pSourcePath, nSourceLen, 1, fp);
for (int i = 0; i<nSpaceLen; ++i)
fwrite(" ", 1, 1, fp);
fwrite(pFunName, nFunLen, 1, fp);
fwrite(" ", 1, 1, fp);
fwrite(szLine, nLineLen, 1, fp);
fwrite(": ", 2, 1, fp);
fwrite(pLogText, nLogLen, 1, fp);
fwrite("\n", 1, 1, fp);
fclose(fp);
} void CSimpleLog::Write(const char* pSourcePath, const char* pFunName, const long lLine, const wchar_t* pLogText)
{
string strLogText = U2A(pLogText);
Write(pSourcePath, pFunName, lLine, strLogText.c_str());
} string CSimpleLog::GetTime()
{
SYSTEMTIME st;
::GetLocalTime(&st);
char szTime[26] = { 0 };
sprintf_s(szTime, "%04d-%02d-%02d %02d:%02d:%02d %d ", st.wYear, st.wMonth, st.wDay, st.wHour, \
st.wMinute, st.wSecond, st.wMilliseconds);
return szTime;
} string CSimpleLog::U2A(const wstring& str)
{
string strDes;
if (str.empty())
return strDes;
int nLen = ::WideCharToMultiByte(CP_ACP, 0, str.c_str(), str.size(), NULL, 0, NULL, NULL);
if (0 == nLen)
return strDes;
char* pBuffer = new char[nLen + 1];
memset(pBuffer, 0, nLen + 1);
::WideCharToMultiByte(CP_ACP, 0, str.c_str(), str.size(), pBuffer, nLen, NULL, NULL);
pBuffer[nLen] = '\0';
strDes.append(pBuffer);
delete[] pBuffer;
__end:
return strDes;
} void CSimpleLog::ScanfWrite(const char* pSourcePath, const char* pFunName, const long lLine, \
const char* pLogText, ...)
{
va_list pArgs;
va_start(pArgs, pLogText);
char szBuffer[1024] = { 0 };
_vsnprintf_s(szBuffer, 1024, pLogText, pArgs);
va_end(pArgs);
Write(pSourcePath, pFunName, lLine, szBuffer);
} void CSimpleLog::ScanfWrite(const char* pSourcePath, const char* pFunName, const long lLine, \
const wchar_t* pLogText, ...)
{
va_list pArgs;
va_start(pArgs, pLogText);
wchar_t szBuffer[1024] = { 0 };
_vsnwprintf_s(szBuffer, 1024, pLogText, pArgs);
va_end(pArgs);
Write(pSourcePath, pFunName, lLine, szBuffer);
} #ifdef LOG_ENABLE
#define SL_LOG(x) g_log.Write(__FILE__, __FUNCTION__, __LINE__, x)
#define SL_LOG1(x, p1) <span style="white-space:pre"> </span>g_log.ScanfWrite(__FILE__, __FUNCTION__, __LINE__, x, p1)
#define SL_LOG2(x, p1, p2) <span style="white-space:pre"> </span>g_log.ScanfWrite(__FILE__, __FUNCTION__, __LINE__, x, p1, p2)
#define SL_LOG3(x, p1, p2, p3) <span style="white-space:pre"> </span>g_log.ScanfWrite(__FILE__, __FUNCTION__, __LINE__, x, p1, p2, p3)
#else
#define SL_LOG(x)
#define SL_LOG1(x, p1)
#define SL_LOG2(x, p1, p2)
#define SL_LOG3(x, p1, p2, p3)
#endif

  

利用可变参数打印log2的更多相关文章

  1. 利用可变参数打印log

    // ConsoleApplication1.cpp: 定义控制台应用程序的入口点. // #pragma once #include <string> #include <Wind ...

  2. C利用可变参数列表统计一组数的平均值,利用函数形式参数栈原理实现指针运算

    //描述:利用可变参数列表统计一组数的平均值 #include <stdarg.h> #include <stdio.h> float average(int num, ... ...

  3. _vsnprintf在可变参数打印中的用法

    _vsnprintf,C语言库函数之一,属于可变参数.用于向字符串中打印数据.数据格式用户自定义. 函数简介 编辑 头文件: #include <stdarg.h> 函数声明: int _ ...

  4. 利用可变参数模拟Printf()函数实现一个my_print()函数和调用可变参数注意的陷阱!

    可变参数函数的实现与函数调用的栈结构密切相关,正常情况下C的函数参数入栈规则为__stdcall, 它是从右到左的,即函数中的最右边的参数最先入栈. 例如,对于函数: void test(char a ...

  5. Linux可变参数打印日志(二)

    #include<stdio.h> #include<stdlib.h> #include<stdarg.h> #include<string.h> # ...

  6. Linux 打印可变参数日志

    实现了传输进去的字符串所在的文档,函数和行数显示功能. 实现了将传入的可变参数打印到日志功能. #include<stdio.h> #include<stdarg.h> #in ...

  7. 【C语言】模拟实现printf函数(可变参数)

    一.printf函数介绍 printf功能 printf函数是格式化输出函数,一般用于向标准输出设备按规定格式输出信息. printf原型 int printf( const char* format ...

  8. Java基础——可变参数

    大家都知道main方法的参数就是一个数组类型的,那么它其实也是可以改成不定参数类型.我试了试,并调用了一些弹出来的方法. public class ClassC2 { public static vo ...

  9. Redis源码笔记--服务器日志和函数可变参数处理server.c

    前言 Redis源码中定义了几个和日志相关的函数,用于将不同级别的信息打印到不同的位置(日志文件或标准输出,取决于配置文件的设置),这些函数的定义位于 server.h 和server.c 文件中,包 ...

随机推荐

  1. Omi框架学习之旅 - 获取DOM节点 及原理说明

    虽然绝大部分情况下,开发者不需要去查找获取DOM,但是还是有需要获取DOM的场景,所以Omi提供了方便获取DOM节点的方式. 这是官网的话,但是我一直都需要获取dom,对dom操作,所以omi提供的获 ...

  2. mysqldump备份数据库

    1. 备份数据库-->sql文件 mysqldump -h192.168.1.100 -uuser -p123 --databases name > /tmp/databasedump.s ...

  3. 走近SpringBoot

    (博客园不支持MarkDown编辑,看完整版请移步:https://www.zybuluo.com/Allen-llh/note/1199946) 1. (Building a RESTful Web ...

  4. C#宣告一个变量

    在C#程序里,宣告一个变量,是件很容易的事情.如下面,宣告一个变量,并赋值: ; Console.WriteLine(type); bool type1 = false; Console.WriteL ...

  5. sun.misc.BASE64Decoder 限制取消

    sun.misc.BASE64Decoder Windows -> Preferences -> Java -> Compiler -> Errors/Warnings -&g ...

  6. C# 简单的 Job 作业~

    改变之前的前言,这次咱这样写: 一个习惯只需十天的坚持就可以养成,坏习惯也不例外!吸烟喝酒的我能否做到十天不吸烟喝酒呢? 呵呵 养成习惯关键还要看决心和意志力 恩,努力控烟吧! 废话说完了,就进入咱们 ...

  7. Intellij Idea 返回上次编辑快捷键设置

    由于默认的返回上次编辑快捷键和和笔记本冲突. 需要从新设置快捷键. 找了好久终于找到了.  分别选中Back和Forward后设置新的快捷键即可

  8. Git的学习与使用

    Git使用教程 一:Git是什么? Git是目前世界上最先进的分布式版本控制系统. 二:SVN和Git最主要的区别? SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而干活的时候,用的都是自 ...

  9. 个人博客作业Week 3 ——微软必应词典客户端

    产品:必应词典客户端 (http://bing.msn.cn/dict/)必应词典有PC,Win8/10, Windows Phone,iPhone,Android,iPad 客户端 选择客户端为:i ...

  10. Daily Scrumming* 2015.12.20(Day 12)

    一.团队scrum meeting照片 二.成员工作总结 姓名 任务ID 迁入记录 江昊 任务1090 https://github.com/buaaclubs-team/temp-front/com ...