作者:Steven
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处

场景需求

开发软件或者进行其他编程工作时,软件可能会长时间运行,但是!一旦突然崩溃就让人一脸懵逼,此时,日志log的功能就体现出来了,如果在日常编程的时候,有同步编写日志模块的好习惯,那么后期进行调试或者bug修复就很容易定位问题所在,大大提高开发效率哦~

相关函数说明

       A.获取工作目录路径

/**
* @brief GetProgramDir                     获取当前工作目录路径
* @return                                  路径
*/
string GetProgramDir()
{char FullPath[MAX_PATH]; // 声明路径string strPath = "";GetModuleFileNameA(NULL, FullPath, MAX_PATH);  // 获取当前运行程序的绝对路径strPath = (string)FullPath;    // 转为string型int pos = static_cast<int>(strPath.find_last_of('\\', strPath.length()));return strPath.substr(0, pos);  // 返回当前文件夹,不带文件名
}

       B.获取当前时间

/**
* @brief GetCurrentTimeA                   获取当前时间信息
* @return
* 需要用到time.h和ctime
*/
string GetCurrentTimeA(tm in)
{tm *ct = &in;int year, month, day, hour, minute, second;// 年月日时分秒。year = ct->tm_year + 1900;                 // 年份基础从1900开始的,所以要加上month = ct->tm_mon + 1;                    // 月份是0-11,对应1-12月day = ct->tm_mday;hour = ct->tm_hour;minute = ct->tm_min;second = ct->tm_sec;char temp[100];                            // 创建字符数组。sprintf(temp, "%04d-%02d-%02d %02d:%02d:%02d: ", year, month, day, hour, minute, second);// 时间信息合并。string out(temp);                          // 转化为string型return move(out);                          // 用move(string)速度快很多。
}

        C.书写日志内容

/**
* @brief WriteLog                          写进日志
* @param msg                               内容
* @return                                  状态码
*/
int WriteLog(string msg)
{struct tm *local;time_t t;t = time(NULL);local = localtime(&t);string dtime = GetCurrentTimeA(*local);ofstream outfile;outfile.open(GetProgramDir() + "\\" + "log.txt", ios::app); //文件的物理地址,文件的打开方式, 如果没有会自动创建if (outfile.is_open()){outfile << dtime << msg << "\n";outfile.close();return 0;}else{return 1;}
}

可能遇到的问题

可能出现sprintf和localtime不安全的警告提示,vs2017反正会出现,这个没啥影响,直接屏蔽掉就行~

图1 警告提示

屏蔽方案:

项目设置->C/C++->预处理器->预处理器定义,加上_CRT_SECURE_NO_WARNINGS即可。

图2 解决方案

C++实现代码

#include <iostream>
#include <fstream>
#include <sstream>
#include <time.h>
#include <ctime>
#include <Windows.h>using namespace std;string GetProgramDir();
string GetCurrentTimeA(tm in);
int WriteLog(string msg);int main(void)
{WriteLog("ready!!!!");Sleep(500);WriteLog("go!!!!");Sleep(500);WriteLog("yes!!!!");return 0;
}string GetProgramDir()
{char FullPath[MAX_PATH]; // 声明路径string strPath = "";GetModuleFileNameA(NULL, FullPath, MAX_PATH);  // 获取当前运行程序的绝对路径strPath = (string)FullPath;    // 转为string型int pos = static_cast<int>(strPath.find_last_of('\\', strPath.length()));return strPath.substr(0, pos);  // 返回当前文件夹,不带文件名
}string GetCurrentTimeA(tm in)
{tm *ct = &in;int year, month, day, hour, minute, second;// 年月日时分秒。year = ct->tm_year + 1900;                 // 年份基础从1900开始的,所以要加上month = ct->tm_mon + 1;                    // 月份是0-11,对应1-12月day = ct->tm_mday;hour = ct->tm_hour;minute = ct->tm_min;second = ct->tm_sec;char temp[100];                            // 创建字符数组。sprintf(temp, "%04d-%02d-%02d %02d:%02d:%02d: ", year, month, day, hour, minute, second);// 时间信息合并。string out(temp);                          // 转化为string型return move(out);                          // 用move(string)速度快很多。
}int WriteLog(string msg)
{struct tm *local;time_t t;t = time(NULL);local = localtime(&t);string dtime = GetCurrentTimeA(*local);ofstream outfile;outfile.open(GetProgramDir() + "\\" + "log.txt", ios::app); //文件的物理地址,文件的打开方式, 如果没有会自动创建if (outfile.is_open()){outfile << dtime << msg << "\n";outfile.close();return 0;}else{return 1;}
}

测试效果

图3 日志文件

图4 日志内容

我写的代码都力求简单好理解,方便大家自由发挥,不然一坨代码扔上去属实可能看不太懂。。。

       如果这个功能有帮助到你,给点个赞吧嘿嘿~

C++-实现日志log功能相关推荐

  1. php实现项目的日志记录功能,tp5框架使用composer实现日志记录功能示例

    本文实例讲述了tp5框架使用composer实现日志记录功能.分享给大家供大家参考,具体如下: tp5实现日志记录 1.安装 psr/log composer require psr/log 它的作用 ...

  2. 配置Haproxy增加日志记录功能

    2019独角兽企业重金招聘Python工程师标准>>> CentOS 7上yum安装的Haproxy,默认没有记录日志.需要做一下配置才能记录日志. 1.创建日志文件/var/log ...

  3. 关于Quartz.NET作业调度框架的一点小小的封装,实现伪AOP写LOG功能

    Quartz.NET是一个非常强大的作业调度框架,适用于各种定时执行的业务处理等,类似于WINDOWS自带的任务计划程序,其中运用Cron表达式来实现各种定时触发条件是我认为最为惊喜的地方. Quar ...

  4. java core日志在哪里_java-如何在未启用日志记录功能的情况下在...

    我已使用CXF 3.0.0 Milestone1创建了Rest服务,并且试图在SEND阶段的Out Interceptor中获取HTTP响应的正文,并将其放入String变量中,而未在xml配置文件中 ...

  5. 运维记录 - 业务日志清理功能

    线上某些系统业务跑一段时间后,日志就会越来越多,考虑到业务机器磁盘有限,需要添加业务日志清理功能.根据日志所在分区磁盘使用情况来判断是否清理日志,比如当日志分区磁盘空间使用超过90%时,将一周前的日志 ...

  6. 如何正确使用日志Log

    如何正确使用日志Log title: 如何正确使用日志Log date: 2015-01-08 12:54:46 categories: [Python] tags: [Python,log] --- ...

  7. Android 各层中日志打印功能的应用

    Android 各层中日志打印功能的应用 1. HAL层 头文件:#include <utils/Log.h>  对应的级别 打印方法   VERBOSE LOGV() DEBUG LOG ...

  8. 扩展log4j2日志归档功能预研

    背景 因项目日志管理不够规范,日志文件需人为维护,这将会因人为原因导致日志误删的情况,现为了规范日志归档因此现对log4j2日志归档功能进行扩展预研,如有问题欢迎指正. 软件版本 log4j2 2.1 ...

  9. 创建一个简单的后台教务管理系统,包含动态增删改查学生,年级和课程信息及查看登录日志等功能,包含表单验证.

    创建一个简单的后台教务管理系统,包含动态增删改查学生,年级和课程信息及查看登录日志等功能,包含表单验证. 一.显示页面 新建一个登录页面,即login.jsp <%--Created by In ...

最新文章

  1. Intellij IDEA 没办法创建java文件
  2. Codeforces Round #321 (Div. 2) D Kefa and Dishes(dp)
  3. 国内国外虚拟主机的对比
  4. Spring MVC——POST请求application/x-www-form-urlencoded方式参数嵌套POJO解决方案
  5. Spring Data Redis:Sentinel的高可用性
  6. ListString 和 ArrayListString的区别
  7. yolov3 使用darknet的python接口使用
  8. informix软件
  9. 【如何选择到合适的天线-天线参数讲解 】
  10. tpac100控制器设置教程_TP-link AC控制器统一管理AP设置指导
  11. Vs code PIO一直loading
  12. 阿里云服务器部署学习笔记
  13. 华侨大学教务系统评教脚本----一键评教
  14. 计算机视觉基础——3D空间坐标点的重建(三角测量)
  15. 紫外线检测仪,WKM-UV1,紫外线检测仪UV汞灯LEDUV通用
  16. 关系型数据库选型MySQL、 Oracle、SQL server、DB2、PostgreSql
  17. 动态规划dp练习 7.4
  18. linux系统安装腾达U1无线网卡驱动
  19. html个人浮水入门day02
  20. Python的attr三兄弟(getattr、hasattr、setatter)

热门文章

  1. 为什么说车联网安全将成为热门产业
  2. ArcGIS图层介绍
  3. json处理第一篇:利用Jackson处理json
  4. Codis安装部署全架构
  5. Redis入门系列数据类型及相关命令
  6. C#的变迁史 - C# 4.0 之多线程篇
  7. Hive MapJoin OOM
  8. left join on、where后面的条件的区别
  9. 一个简单的samba案例(测试与思考)
  10. 一级计算机技术,《一级考试大参考》自动化技术、计算机技术.pdf