C++实现简单的日志记录

//dlogger.h
#ifndef DLOGGER_H
#define DLOGGER_H #include <iostream>
#include <Mutex>
#include <ctime>
#include <string> extern std::mutex mt; //用于获取运行时间
class Duration
{
public:
explicit Duration() : m_start(clock()){} inline double duration(); private:
clock_t m_start;
}; double Duration::duration()
{
return (double)(clock() - m_start) / CLOCKS_PER_SEC;
} class DLogger
{
public:
enum LogLevel
{
Log_Info = 0,
Log_Debug,
Log_Warning,
Log_Error,
Log_Fatal,
Level_Num
}; public:
explicit DLogger(const std::string &dir = ""); void log(const char* msg, const char* fileName, int line, LogLevel level = Log_Info); private:
std::string m_fileName;
static const std::string m_levelMsg[Level_Num];
}; extern std::mutex mt; #endif //dlogger.cpp
#include "dlogger.h"
#include <cstring> std::mutex mt; const std::string DLogger::m_levelMsg[Level_Num] =
{
"Info",
"Debug",
"Warning",
"Error",
"Fatal"
}; /**
* 为日志文件提供一个目录,不提供目录则表示当前工作目录
*/
DLogger::DLogger(const std::string &dir)
{
char buf[64];
time_t now = time(0);
tm* ltm = localtime(&now); sprintf(buf, "%d-%d-%d.log", ltm->tm_year + 1900, ltm->tm_mon + 1, ltm->tm_mday); if(dir.empty())
{
m_fileName = buf;
}
else
{
m_fileName = dir + "\\" + buf;
} } /**
* 记录日志
* @param msg [日志信息]
* @param fileName [日志信息文件名]
* @param line [日志信息所在行]
* @param level [日志信息等级]
*/
void DLogger::log(const char* msg, const char* fileName, int line, LogLevel level)
{
mt.lock(); FILE* fp = ::fopen(m_fileName.data(), "a+");
if(!fp)
{
mt.unlock();
return;
}
char buf[1024]; time_t now = time(0);
tm *ltm = localtime(&now); ::sprintf(buf, "%d/%d/%d %d:%d:%d, %s, %d, %s, %s\n",
1900+ltm->tm_year, ltm->tm_mon, ltm->tm_mday,
ltm->tm_hour, ltm->tm_min, ltm->tm_sec,
fileName, line, msg, m_levelMsg[level].data()); ::fwrite(buf, sizeof(char),strlen(buf), fp);
::fclose(fp); mt.unlock();
}

C++实现简单的日志记录的更多相关文章

  1. Net Core平台灵活简单的日志记录框架NLog+SqlServer初体验

    Net Core平台灵活简单的日志记录框架NLog+SqlServer初体验 前几天分享的"[Net Core平台灵活简单的日志记录框架NLog+Mysql组合初体验][http://www ...

  2. Net Core平台灵活简单的日志记录框架NLog+Mysql组合初体验

    Net Core平台灵活简单的日志记录框架NLog初体验 前几天分享的"[Net Core集成Exceptionless分布式日志功能以及全局异常过滤][https://www.cnblog ...

  3. 基于java.util.logging实现轻量级日志记录库(增加根据当前类class初始化,修复线程池模型(javaEE)下的堆栈轨迹顺序与当前调用方法不一致问题)

    前言: 本章介绍自己写的基于java.util.logging的轻量级日志记录库(baseLog). 该版本的日志记录库犹如其名,baseLog,是个实现日志记录基本功能的小库,适合小型项目使用,方便 ...

  4. C#日志记录设计与实现(BenXHLog)

    C#日志记录设计与实现 日志记录: 日志记录在程序设计开发过程中,是非常重要的,可以供调试和记录数据,虽然说有开源的强大日志管理系统,比如apache的Log4Net,功能可谓强悍,但是有时候,不需要 ...

  5. 在android中配置 slf4j + log4j 日志记录框架

    需求: 在项目开发中,需要记录 操作日志 .起初自己写了个简单的日志记录文本写入到文本的方法,后来随着项目的膨胀,需要考虑更多的操作,开始考虑性能问题. 实现: 考虑使用 slf4j + log4j ...

  6. Python学习 :常用模块(三)----- 日志记录

    常用模块(三) 七.logging模块 日志中包含的信息应有正常的程序访问日志,还可能有错误.警告等信息输出 python的 logging 模块提供了标准的日志接口,你可以通过它存储各种格式的日志, ...

  7. php 简单通用的日志记录方法

    使用file_put_contents 方法来实现简单便捷的日志记录功能 方法1: // use \r\n for new line on windows, just \n on linux func ...

  8. 从壹开始前后端分离【 .NET Core2.0 +Vue2.0 】框架之十 || AOP面向切面编程浅解析:简单日志记录 + 服务切面缓存

    代码已上传Github+Gitee,文末有地址 上回<从壹开始前后端分离[ .NET Core2.0 Api + Vue 2.0 + AOP + 分布式]框架之九 || 依赖注入IoC学习 + ...

  9. Z从壹开始前后端分离【 .NET Core2.0/3.0 +Vue2.0 】框架之十 || AOP面向切面编程浅解析:简单日志记录 + 服务切面缓存

    本文梯子 本文3.0版本文章 代码已上传Github+Gitee,文末有地址 大神反馈: 零.今天完成的深红色部分 一.AOP 之 实现日志记录(服务层) 1.定义服务接口与实现类 2.在API层中添 ...

随机推荐

  1. 51 Nod 1678 lyk与gcd(容斥原理)

    1678 lyk与gcd  基准时间限制:2 秒 空间限制:131072 KB 分值: 80 难度:5级算法题  收藏  关注 这天,lyk又和gcd杠上了. 它拥有一个n个数的数列,它想实现两种操作 ...

  2. CDOJ 203 并查集+优先队列 好题

    题目链接 Islands Time Limit: 30000/10000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) S ...

  3. macOS 更新 git 命令提示 xcrun,.gitignore 配置不生效问题。

    macOS 更新 运行git提示xcrun: error: invalid active developer path 在终端输入 xcode-select --install 即可以解决该问题 .g ...

  4. sqli-labs(25a)

    0X01 看见bind好像是盲注的意思 尝试闭合语句 加入’ 报错  双引号也报错 难道是不许要闭合的? 我们尝试一下 发现过滤了and ?id= and = 那么我们构造 ?id= aandnd = ...

  5. Spring各种类型数据的注入

    直接上代码: 一个MessageBean类 package com.henu.spring; import java.util.*; public class MessageBean { privat ...

  6. SQL Server新老版本CE区别

    对比CE7和2014 CE12的区别: 1.表连接中连接列估算方式 老CE对所有参与连接列的统计信息step进行逐个估算.新CE只对于最大和最小step统计信息进行收集估算,在连接列的值分布不均匀的时 ...

  7. 1450:【例 3】Knight Moves

    1450:[例 3]Knight Moves  题解 这道题可以用双向宽度搜索优化(总介绍在  BFS ) 给定了起始状态和结束状态,求最少步数,显然是用BFS,为了节省时间,选择双向BFS. 双向B ...

  8. iOS堆栈内存区别

    堆和栈的区别: · 1> 堆空间的内存是动态分配的,一般存放对象,并且需要手动释放内存. · 2> 栈空间的内存由系统自动分配,一般存放局部变量等,不需要手动管理内存. 接下来我将从以下几 ...

  9. 微博获取原图时重定向到图片的url

    微博获取原图时重定向到图片的url,所以获取的是乱码 jsoup默认是执行重定向的. //根据Url获取页面对应的Document public static Document getDoc1(Str ...

  10. Git-Runoob:Git 基本操作

    ylbtech-Git-Runoob:Git 基本操作 1.返回顶部 1. Git 基本操作 Git 的工作就是创建和保存你项目的快照及与之后的快照进行对比.本章将对有关创建与提交你的项目快照的命令作 ...