这是一个简单的日志记录方法,为了避免单个日志文件过大,所以每个小时生成一个新的日志文件

注意:g_pLogPath 可以带路径,但是必须手动创建好路径,保证目录存在。而且要详细到log文件名,不能带后缀,后缀默认为.log

   后缀名需要在createLogFileName()中修改,可以改为.txt

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 createLogFileName();
string GetTime();
int myLog(const char* pSourcePath, const char* pFunName, const long lLine, const char* fmt, ...);
void myLogStr(const char* pSourcePath, const char* pFunName, const long lLine, const char* pLogText); #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 = ".\\log\\test"; string createLogFileName()
{
char logPath[] = { };
SYSTEMTIME st;
::GetLocalTime(&st);
char szTime[] = { };
sprintf(szTime, "%04d-%02d-%02d-%02d", st.wYear, st.wMonth, st.wDay, st.wHour);
sprintf(logPath, "%s%s%s", g_pLogPath, szTime, ".log");
// printf("%s\n",logPath);
return logPath;
} 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(createLogFileName().c_str(), "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;
} void myLogStr(const char* pSourcePath, const char* pFunName, const long lLine, const char* pLogText)
{
if (pLogText == NULL)
return;
int nLogLen = strlen(pLogText);
if (nLogLen == )
return;
int nSourceLen = strlen(pSourcePath);
int nFunLen = strlen(pFunName);
char szLine[] = { };
sprintf(szLine, "%ld", lLine);
int nLineLen = strlen(szLine);
int nSpaceLen = - nSourceLen - nFunLen - nLineLen;
string strTime = GetTime();
FILE* fp = NULL;
fp = fopen(createLogFileName().c_str(), "a+");
fwrite(strTime.c_str(), strTime.size(), , fp);
fwrite(" ", , , fp);
fwrite(pSourcePath, nSourceLen, , fp);
for (int i = ; i<nSpaceLen; ++i)
fwrite(" ", , , fp);
fwrite(pFunName, nFunLen, , fp);
fwrite(":", , , fp);
fwrite(szLine, nLineLen, , fp);
fwrite(" ", , , fp);
fwrite(pLogText, nLogLen, , fp);
fwrite("\n", , , fp);
fclose(fp);
}

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. log4j自动生成日志文件配置

    生成文件到默认位置: #生成日志文件 #log4j.appender.systemFile=org.apache.log4j.RollingFileAppender #按天生成 log4j.appen ...

  2. NGINX按天生成日志文件的简易配置

    NGINX按天生成日志文件的简易配置 0x01 最近后端童鞋遇到一个小需求,拆分nginx生成的log文件,最好是按天生成,看着她还有很多bug待改的状态,我说这个简单啊,我来吧.曾经搞node后端的 ...

  3. 使用log4net生成日志文件

    (一)使用log4net生成日志文件   1.引入log4net.dll 1.1 Nuget安装 或 http://logging.apache.org/log4net/下载log4net的源代码,编 ...

  4. SpringBoot日志配置(详解) 涉及控制台输出日志、生成日志文件、日志级别修改、hibernate日志不输出

    写在前面 本篇主要讲述日志配置,看完本篇可以解决下述问题, 控制台输出日志.生成日志文件.日志级别修改.hibernate日志不输出 Git Demo Path:https://github.com/ ...

  5. 【spring boot logback】日志logback 生成日志文件在本项目下,而不在指定的日志文件目录下/指定日志文件到达最大值后不按照配置进行切割

    原本的日志文件配置如下: <?xml version="1.0" encoding="UTF-8"?> <configuration scan ...

  6. Flask log配置,实现按照日期自动生成日志文件

    Flask自带了logger模块,用来方便程序员群众记录日志,这里粘贴出来的是一段代码,用来初始化日志各项配置参数,并根据日期自动生成日志文件. #log配置,实现日志自动按日期生成日志文件def m ...

  7. C# 开发 Windows 服务 使用Log4net 组件 不能生成日志文件

    使用VS2012开发Windows服务,需要使用Log4net日志组件记录业务情况,但是始终生成不了日志文件. /// <summary> /// 入口方法 /// </summar ...

  8. [转]如何禁止 IIS 在 C:\Windows\System32\LogFiles\HTTPERR 中生成日志文件

    1. 在注册表 HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\HTTP\Parameters 中新建 dword 值:EnableError ...

  9. (一)使用log4net生成日志文件

    1.引入log4net.dll 1.1 Nuget安装 或 http://logging.apache.org/log4net/下载log4net的源代码,编译后把log4net.dll引入项目. 2 ...

随机推荐

  1. 【Codeforces 1137C】Museums Tour

    Codeforces 1137 C 题意:给一个有向图,一周有\(d\)天,每一个点在每一周的某些时刻会开放,现在可以在这个图上从\(1\)号点开始随意地走,问最多能走到多少个开放的点.一个点如果重复 ...

  2. MySQL(六)常用语法和数据类型

    阅读MySQL语法时,需要注意的规则: ①符号用来指出几个选择中的一个,比如:null | not null表示或者给出null或者给出not null: ②包含在方括号中的关键字或子句(如[like ...

  3. Java实现对象的序列化

    什么是对象的序列化? 序列化:把对象转化成字节序列的过程就是对象的序列化:反序列化:把字节序列转化成对象的过程就是对象的反序列化.单看概念比较抽象,但是看代码就会明白. 对象序列化的用途 1.Java ...

  4. oracle pls-00382:表达式类型错误

    转载至:pls-00382:表达式类型错误 错误:pls-00382:表达式类型错误 如何产生: 我是在将一个动态sql付给一个nvarchar2变量是出现这个错误的,示例代码如下: declare ...

  5. 在lua中创建字段安全的对象

    lua萌新,刚刚学习和使用不到一个月.有不对的地方,还望各路大神不吝赐教. lua中可以用table来模拟对象,但table是可以任意增加键值的.在对象模拟中,暂且也叫它为字段(field)吧.如果在 ...

  6. Maven-SSM项目pom.xml配置以及springmvc配置以及mybatis配置及web.xml配置

    一.Maven本地仓库的pom.xml配置 (全部是mysql数据库) <project xmlns="http://maven.apache.org/POM/4.0.0" ...

  7. 系统重启后DNS地址默认修改修改引起的一次事故(Tomcat报错:java.net.UnknownHostException)

    事故描述:公司的一个内部业务系统由于程序bug,导致系统崩溃,需要强制重启服务器.系统重启后,赶紧将业务程序启动.随后发现/etc/resolv.conf文件的DNS地址被修改成了默认地址.发现之后, ...

  8. Centos7下部署两套python版本并存环境的操作记录

    需求说明:centos7.2系统的开发机器上已经自带了python2.7版本,但是开发的项目中用的是python3.5版本,为了保证Centos系统的正常运行,以及节省机器资源(不想因此再申请另外一台 ...

  9. LVM常规操作记录梳理(扩容/缩容/快照等)

    基本介绍Linux用户安装Linux 操作系统时遇到的一个最常见的难以决定的问题就是如何正确地给评估各分区大小,以分配合适的硬盘空间.随着 Linux的逻辑盘卷管理功能的出现,这些问题都迎刃而解, l ...

  10. C# wkhtmltopdf 将html转pdf(详解)

    https://www.cnblogs.com/louby/p/905198.html转自,看文章只放了代码看起来云里雾里的,在此做些解析 使用说明: 1.首先呢,得安装下软件,地址下面有链接,文件里 ...