【超级简单的日志模块】

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 【超级简单的日志模块】

超级简单的日志模块

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日志并进行多维度分析。
相关文章
|
6月前
【云备份|| 日志 day6】文件业务处理模块
【云备份|| 日志 day6】文件业务处理模块
|
2月前
|
Prometheus Cloud Native Go
Golang语言之Prometheus的日志模块使用案例
这篇文章是关于如何在Golang语言项目中使用Prometheus的日志模块的案例,包括源代码编写、编译和测试步骤。
55 3
Golang语言之Prometheus的日志模块使用案例
|
2月前
|
Shell Python
salt自定义模块内使用日志例子
salt自定义模块内使用日志例子
logging 日志 模块
logging 日志 模块
|
3月前
|
Go 开发者
【应用服务 App Service】App Service发生错误请求时,如何查看IIS Freb日志,从中得知错误所发生的模块,请求中所携带的Header信息
【应用服务 App Service】App Service发生错误请求时,如何查看IIS Freb日志,从中得知错误所发生的模块,请求中所携带的Header信息
|
3月前
|
数据挖掘 语音技术
3D-Speaker说话人任务的开源项目问题之语义说话人信息模块在说话人日志系统中的问题如何解决
3D-Speaker说话人任务的开源项目问题之语义说话人信息模块在说话人日志系统中的问题如何解决
|
3月前
|
存储 监控 Java
|
3月前
|
存储 安全 Python
[python]使用标准库logging实现多进程安全的日志模块
[python]使用标准库logging实现多进程安全的日志模块
|
4月前
|
存储 算法 开发工具
Etcd/Raft 原理问题之Etcd-Raft是什么
Etcd/Raft 原理问题之Etcd-Raft是什么
|
3月前
|
监控 Java API
如何将不同业务模块产生的日志 分多文件记录
如何将不同业务模块产生的日志 分多文件记录
63 0
下一篇
无影云桌面