下面是在windows下编程实现的日志打印,写的比较简单,可以根据实际情况进行修改使用。

宏WRITELOG在vs2013可以正常使用。

在vs2003和vs2010可能会报错,可以直接使用myLog函数,就是比较麻烦,需要传参数(__FILE__, __FUNCTION__, __LINE__)

这个例子日志会一直保存在同一个文件,如果想要每小时生成一个新的日志文件,请看https://www.cnblogs.com/nanqiang/p/9642231.html

log.h

#pragma once
#define WRITE_LOG_ENABLE //启用日志打印 #include <string>
#include <Windows.h>
#include <stdio.h>
using std::string;
using std::wstring;
extern const char* g_pLogPath; string GetTime();
int myLog(const char* pSourcePath, const char* pFunName, const long lLine, const char* fmt, ...); #ifdef WRITE_LOG_ENABLE
#define WRITELOG(format, ...) myLog(__FILE__, __FUNCTION__, __LINE__, format, ##__VA_ARGS__) #else
#define WRITELOG(format, ...) #endif

log.cpp

#include  "Log.h"
#include "StdAfx.h"
#include <string>
#include <Windows.h>
#include <stdio.h>
using std::string;
using std::wstring; const char* g_pLogPath = ".\\test.log"; string GetTime()
{
SYSTEMTIME st;
::GetLocalTime(&st);
char szTime[] = { };
sprintf(szTime, "%04d-%02d-%02d %02d:%02d:%02d %d ", st.wYear, st.wMonth, st.wDay, st.wHour, \
st.wMinute, st.wSecond, st.wMilliseconds);
return szTime;
}
int myLog(const char* pFileName, const char* pFunName, const long lLine, const char* fmt, ...)
{
int ret = ;
//va_list是一个字符串指针,用于获取不确定个数的参数
va_list args;
//读取可变参数的过程其实就是在堆栈中,使用指针,遍历堆栈段中
//的参数列表,从低地址到高地址一个一个的把参数内容读出来的过程
va_start(args, fmt);
//该函数会根据参数fmt字符串来转换格式并格式化数据,然后将结果输出到参数Stream指定的文件中
//直到出现字符串结束的\0为止。
FILE* fp = NULL;
fp = fopen(g_pLogPath, "a+");
string strTime = GetTime();
fprintf(fp, "%s ", strTime.c_str());//写时间 int nFileNameLen = strlen(pFileName);
char szLine[] = { };
sprintf(szLine, "%ld", lLine);
int nLineLen = strlen(szLine);
int nSpaceLen = - nFileNameLen - nLineLen;
for (int i = ; i < nSpaceLen; ++i)
{
fwrite(" ", , , fp);
}
fprintf(fp, "%s:%ld ", pFileName, lLine);
ret = vfprintf(fp, fmt, args); //获取完所有参数之后,为了避免发生程序瘫痪,需要将 ap指针关闭,其实这个函数相当于将args设置为NULL
va_end(args);
fflush(fp);
fclose(fp);
return ret;
}

main.cpp

// WriteLog.cpp : 定义控制台应用程序的入口点。
// #include "stdafx.h"
#include "log.h" int _tmain(int argc, _TCHAR* argv[])
{
for (int i = ; i < ; i++)
{
WRITELOG("打印%s%d%s%\n", "hello...", , "hello...");
}
string test = "结束打印";
WRITELOG("%s\n", test.c_str());
WRITELOG("\n");
// system("pause");
return ;
}

windows 下编程实现打印日志的更多相关文章

  1. Windows下编程--模拟时钟的实现

    windows下编程--模拟时钟的实现: 主要可以分为几个步骤: (1)   编写按键事件处理(启动和停止时钟) (2)   编写时钟事件处理,调用显示时钟函数 (3)   编写显示时钟函数,要调用显 ...

  2. Windows下编程2----- C语言常用函数举例

    几个小函数 1.    //MessageBoxA(0,"网络故障,重新登录","qq error",3); //弹出对话框 2.    //ShellExec ...

  3. 使用IDEA2017在Windows下编程并测试Hadoop2.7+Spark2.2+Azkaban

    1. 下载好IDEA HADOOP SPARK 首先,配置IDEA, 在插件管理中使用IDEA在线库安装scala插件, 在在线库直接搜索即可; 其次,配置Maven选项, 将Maven添加到IDEA ...

  4. windows下查看 mysql二进制日志文件

    有时候需要将linux中的mysql从线上linux种down到windows查看,但是这种binlog日志是二进制的,应该怎么查看呢? 使用window上的mysqlbinlog.exe将其转码到另 ...

  5. windows下 定时删除tomcat日志和缓存。可以保留天数

    forfiles /p "e:\Program Files\Tomcat 7.0\logs" /s /m *.log /d -5 /c "cmd /c del @path ...

  6. Nginx - Windows下nginx定时分割日志

    1.建立批处理脚本,c:\soft\demo.bat @echo off taskkill /F /IM nginx.exe > nul cd C:\soft\nginx-1.11.3 rem ...

  7. windows下为mysql添加日志

    mysql的配置文件 [mysqld] …… log-error="D:/phpStudy/log/mysql/mysql_log_err.txt" log="D:/ph ...

  8. 寻找Windows下MySQL的错误日志

    https://blog.csdn.net/dreamcs/article/details/53502625

  9. windows下的socket网络编程

    windows下的socket网络编程 windows下的socket网络编程 clinet.c 客户端 server.c 服务器端 UDP通信的实现 代码如下 已经很久没有在windows下编程了, ...

随机推荐

  1. 【Codeforces 1132C】Painting the Fence

    Codeforces 1132 C 题意:给一些区间\([l_i,r_i]\),从中删掉两个,求剩下的区间最多能够覆盖的格子数量. 思路:首先枚举第一个删掉的区间,然后我们可以通过差分来求出每个格子被 ...

  2. java Scanner类的使用

    参考链接:https://blog.csdn.net/android_depon/article/details/69669160     https://www.cnblogs.com/zhengc ...

  3. python游戏开发之俄罗斯方块(一):简版

    编程语言:python(3.6.4) 主要应用的模块:pygame (下面有源码,但是拒绝分享完整的源码,下面的代码整合起来就是完整的源码) 首先列出我的核心思路: 1,图像由"核心变量&q ...

  4. linux 开机进入initramfs无法开机

    4/4 用fsck命令开始检查.修复(fsck是个很好用了磁盘检测修复命令)输入:fsck -t ext4 /dev/sda1 (-t是指定文件系统类型:现在的多半是ext3和ext4,不知道,你就一 ...

  5. CF835F Roads in the Kingdom/UOJ126 NOI2013 快餐店 树的直径

    传送门--CF 传送门--UOJ 题目要求基环树删掉环上的一条边得到的树的直径的最小值. 如果直接考虑删哪条边最优似乎不太可做,于是考虑另一种想法:枚举删掉的边并快速地求出当前的直径. 对于环上的点, ...

  6. Ionic2 App Import BrowserAnimationsModule or NoopAnimationsModule问题

    在开发app的过程中遇见了动画相关方面的问题,具体如下: 解决方法是:在app.module.ts模块中引入BrowserAnimationsModule import { BrowserAnimat ...

  7. Android开发——ListView使用技巧总结(一)

    )还有一点就是要控制异步任务的执行频率,因为当用户频繁的上下滑动,会瞬间产生上百个异步任务,会带来无意义的大量的UI更新操作,因此可以考虑在列表滑动时停止进行异步任务,直到列表停下来. //判断列表的 ...

  8. 案例学python——案例二:连接数据库MySql

    调侃的话:案例一跑完之后,欣赏把玩了一番.人就有点飘飘然,昨天除了做饭吃饭,就是玩三国杀,江郎才尽,今天周一,不飘了,敲点代码,看看Python操作数据库有啥不一样的. 前期准备: 1.数据库 电脑上 ...

  9. Flutter - BottomNavigationBar底部导航栏切换后,状态丢失

    如果你用过BottomNavigationBar.TabBar.还有Drawer,你就会发现,在切换页面之后,原来的页面状态就会丢失. 要是上一页有一个数据列表,很多数据,你滚动到了下头,切换页面后, ...

  10. open-falcon ---安装Dashboard时候报错"SSLError: The read operation timed out"

    在部署open-falcon环境过程中,安装Dashboard时候报错"SSLError: The read operation timed out".如下: [root@open ...