C++-实现日志log功能

简介: C++-实现日志log功能

场景需求

      开发软件或者进行其他编程工作时,软件可能会长时间运行,但是!一旦突然崩溃就让人一脸懵逼,此时,日志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 日志内容

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

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

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
24天前
|
Java
使用Java代码打印log日志
使用Java代码打印log日志
81 1
|
26天前
|
Linux Shell
Linux手动清理Linux脚本日志定时清理日志和log文件执行表达式
Linux手动清理Linux脚本日志定时清理日志和log文件执行表达式
78 1
|
4天前
|
Java
log4j异常日志过滤规则配置
log4j异常日志过滤规则配置
15 0
|
17天前
|
C++
glog --- C++日志库
glog --- C++日志库
|
17天前
|
运维 安全 Ubuntu
`/var/log/syslog` 和 `/var/log/messages` 日志详解
`/var/log/syslog` 和 `/var/log/messages` 是Linux系统的日志文件,分别在Debian和Red Hat系发行版中记录系统事件和错误。它们包含时间戳、日志级别、PID及消息内容,由`rsyslog`等守护进程管理。常用命令如`tail`和`grep`用于查看和搜索日志。日志级别从低到高包括`debug`到`emerg`,表示不同严重程度的信息。注意保护日志文件的安全,防止未授权访问,并定期使用`logrotate`进行文件轮转以管理磁盘空间。
24 1
|
17天前
|
网络协议 应用服务中间件 Linux
centos7 Nginx Log日志统计分析 常用命令
centos7 Nginx Log日志统计分析 常用命令
33 2
|
18天前
|
Ubuntu Linux 网络安全
/var/log/auth.log日志详解
`/var/log/auth.log`是Linux(尤其是Debian系如Ubuntu)记录身份验证和授权事件的日志文件,包括登录尝试(成功或失败)、SSH活动、sudo使用和PAM模块的操作。登录失败、SSH连接、sudo命令及其它认证活动都会在此记录。查看此日志通常需root权限,可使用`tail`、`less`或`grep`命令。文件内容可能因发行版和配置而异。例如,`sudo tail /var/log/auth.log`显示最后几行,`sudo grep &quot;failed password&quot; /var/log/auth.log`搜索失败密码尝试。
74 8
|
29天前
|
SQL 关系型数据库 MySQL
MySQL数据库,可以使用二进制日志(binary log)进行时间点恢复
对于MySQL数据库,可以使用二进制日志(binary log)进行时间点恢复。二进制日志是MySQL中记录所有数据库更改操作的日志文件。要进行时间点恢复,您需要执行以下步骤: 1. 确保MySQL配置文件中启用了二进制日志功能。在配置文件(通常是my.cnf或my.ini)中找到以下行,并确保没有被注释掉: Copy code log_bin = /path/to/binary/log/file 2. 在需要进行恢复的时间点之前创建一个数据库备份。这将作为恢复的基准。 3. 找到您要恢复到的时间点的二进制日志文件和位置。可以通过执行以下命令来查看当前的二进制日志文件和位
|
1月前
|
监控 Shell Linux
【Shell 命令集合 系统管理 】Linux 自动轮转(log rotation)日志文件 logrotate命令 使用指南
【Shell 命令集合 系统管理 】Linux 自动轮转(log rotation)日志文件 logrotate命令 使用指南
51 0
|
1月前
|
存储 数据库
ALTER MATERIALIZED VIEW LOG :语句来更改现有物化视图日志的存储特征或类型。
`ALTER MATERIALIZED VIEW LOG` 语句用于修改已有的物化视图日志的存储属性或类型。配合示例中的动画图像(由于格式限制无法显示),该语句帮助优化数据库的性能和管理。
44 0