【超级简单的日志模块】

简介: 【超级简单的日志模块】

超级简单的日志模块

windows

linux 下需要 实现 GetPrivateProfileString

头文件 mylog.h

#ifndef MY_LOG_H
#ifdef  MY_LOG_H
#pragma once
#include <iostream>
#include <list>
#include <stdlib.h>
#include <stdio.h>
#include <string>
#include <vector>
#include <fstream>
#include <sstream>
#include <mutex>
#include <Windows.h>
std::mutex s_logfile_mtx;
enum Loglv
{
  DEGUG_LEVEL = 0,
  ERROR_LEVEL = 1
};
void my_log_file(const char* filename, int line, Loglv level, const char* msg, ...);
#define LOGDEBUG(msg, ...) my_log_file(__FILE__, __LINE__, DEGUG_LEVEL, msg, __VA_ARGS__)
#define LOGERROR(msg, ...) my_log_file(__FILE__, __LINE__, ERROR_LEVEL, msg, __VA_ARGS__)

mylog.cpp

#include "mylog.h"
void my_log_file(const char* filename, int line, Loglv level, const char* msg, ...) REQUIRES(!s_logfile_mtx)
{
  if (msg == nullptr)
    return;
  auto                                  pid        = GetCurrentProcessId();
  auto                                  inipath    = "test.ini".u8string();
  std::array<WCHAR, 20480>              content    = {};
  std::chrono::system_clock::time_point now        = std::chrono::system_clock::now();
  std::time_t                           now_time_t = std::chrono::system_clock::to_time_t(now);
  std::tm now_tm {};
  ::localtime_s(&now_tm, &now_time_t);
  char    datetime[20] {};
  char    tdatetime[20] {};
  va_list args;
  va_start(args, msg);
  char buffer[20480] = {0};
  vsnprintf(buffer, sizeof(buffer), msg, args);
  strftime(datetime, sizeof(datetime), "%Y-%m-%d %H:%M:%S", &now_tm);
  if (level == DEGUG_LEVEL)
  {
    GetPrivateProfileString(TEXT("LOG"), TEXT("FLAG"), TEXT(""), content.data(), 20479, str2ws(inipath).c_str());
    if (content[0] != L'1')
      return;
  }
  auto logfilepath = "./MGFastTransfer.log".u8string();
  if (std::filesystem::exists(logfilepath))
  {
    auto fileSize = GetFileSize(logfilepath);
    if (fileSize > static_cast<size_t>(5 * 1024) * 1024)
    {
      strftime(tdatetime, sizeof(tdatetime), "%Y%m%d%H%M%S", &now_tm);
      auto newlogfilepath = "test.log" + std::string(tdatetime)).u8string();
      std::filesystem::rename(logfilepath, newlogfilepath);
    }
  }
  if (!std::filesystem::exists("log"))
  {
    std::filesystem::create_directory("log");
  }
  std::lock_guard(s_logfile_mtx); // 加锁操作
  std::ofstream file(str2ws(logfilepath), std::ios::app);
  if (!file.is_open())
  {
    return;
  }
  file << std::string(datetime) + " 文件名:" + std::string(filename) + " 行号:" + std::to_string(line) + " 进程号:"
            + std::to_string(pid) + " 日志级别:" + std::to_string(level) + " 日志信息:" + buffer + "\n";
  file.close();
#endif
}
#endif

test.c

#include "mylog.h"
int main(){
  LOGERROR("测试%s|%d", "测试", 10);
  return 0;
}
相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
4月前
【云备份|| 日志 day6】文件业务处理模块
【云备份|| 日志 day6】文件业务处理模块
|
4月前
|
存储 JSON 数据管理
【云备份|| 日志 day4】文件信息管理模块
【云备份|| 日志 day4】文件信息管理模块
|
8月前
|
消息中间件 数据采集 SQL
1、电商数仓(用户行为采集平台)数据仓库概念、用户行为日志、业务数据、模拟数据、用户行为数据采集模块、日志采集Flume(一)
1、电商数仓(用户行为采集平台)数据仓库概念、用户行为日志、业务数据、模拟数据、用户行为数据采集模块、日志采集Flume(一)
|
2月前
|
消息中间件 存储 监控
利用Scala编写公司内部监控软件的实时日志监控模块
在当今的软件开发领域,监控是确保系统稳定性和性能的关键一环。随着公司业务的不断扩展,我们迫切需要一套高效、可靠的实时日志监控系统,以及能够自动提交数据到网站的解决方案。本文将介绍如何利用Scala编写公司内部监控软件的实时日志监控模块,并探讨如何自动将监控到的数据提交到网站。
159 2
|
3月前
|
缓存 前端开发 NoSQL
muduo异步日志库模块的实现
muduo异步日志库模块的实现
|
3月前
|
应用服务中间件 nginx
nginx日志模块 ngx_http_log_module
nginx日志模块 ngx_http_log_module
|
4月前
|
存储 文件存储
【云备份|| 日志 day5】文件热点管理模块
【云备份|| 日志 day5】文件热点管理模块
|
4月前
|
JSON 数据格式
【云备份|| 日志 day3】服务端配置信息模块
【云备份|| 日志 day3】服务端配置信息模块
【云备份|| 日志 day3】服务端配置信息模块
|
5月前
|
JSON 监控 数据可视化
实时日志分析:通过Golang编写实时日志分析模块,加强公司监控管理软件的日志监控功能
在当今数字化时代,企业面临着庞大而复杂的网络环境,对实时监控和日志分析的需求变得日益迫切。本文将介绍如何使用Golang编写实时日志分析模块,以增强公司监控管理软件的日志监控功能。通过本文的指导,你将能够建立一个定制的实时日志分析系统,更好地监测和管理公司的网络活动。
225 0