C++实现简单的日志记录
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++实现简单的日志记录的更多相关文章
- Net Core平台灵活简单的日志记录框架NLog+SqlServer初体验
Net Core平台灵活简单的日志记录框架NLog+SqlServer初体验 前几天分享的"[Net Core平台灵活简单的日志记录框架NLog+Mysql组合初体验][http://www ...
- Net Core平台灵活简单的日志记录框架NLog+Mysql组合初体验
Net Core平台灵活简单的日志记录框架NLog初体验 前几天分享的"[Net Core集成Exceptionless分布式日志功能以及全局异常过滤][https://www.cnblog ...
- 基于java.util.logging实现轻量级日志记录库(增加根据当前类class初始化,修复线程池模型(javaEE)下的堆栈轨迹顺序与当前调用方法不一致问题)
前言: 本章介绍自己写的基于java.util.logging的轻量级日志记录库(baseLog). 该版本的日志记录库犹如其名,baseLog,是个实现日志记录基本功能的小库,适合小型项目使用,方便 ...
- C#日志记录设计与实现(BenXHLog)
C#日志记录设计与实现 日志记录: 日志记录在程序设计开发过程中,是非常重要的,可以供调试和记录数据,虽然说有开源的强大日志管理系统,比如apache的Log4Net,功能可谓强悍,但是有时候,不需要 ...
- 在android中配置 slf4j + log4j 日志记录框架
需求: 在项目开发中,需要记录 操作日志 .起初自己写了个简单的日志记录文本写入到文本的方法,后来随着项目的膨胀,需要考虑更多的操作,开始考虑性能问题. 实现: 考虑使用 slf4j + log4j ...
- Python学习 :常用模块(三)----- 日志记录
常用模块(三) 七.logging模块 日志中包含的信息应有正常的程序访问日志,还可能有错误.警告等信息输出 python的 logging 模块提供了标准的日志接口,你可以通过它存储各种格式的日志, ...
- php 简单通用的日志记录方法
使用file_put_contents 方法来实现简单便捷的日志记录功能 方法1: // use \r\n for new line on windows, just \n on linux func ...
- 从壹开始前后端分离【 .NET Core2.0 +Vue2.0 】框架之十 || AOP面向切面编程浅解析:简单日志记录 + 服务切面缓存
代码已上传Github+Gitee,文末有地址 上回<从壹开始前后端分离[ .NET Core2.0 Api + Vue 2.0 + AOP + 分布式]框架之九 || 依赖注入IoC学习 + ...
- Z从壹开始前后端分离【 .NET Core2.0/3.0 +Vue2.0 】框架之十 || AOP面向切面编程浅解析:简单日志记录 + 服务切面缓存
本文梯子 本文3.0版本文章 代码已上传Github+Gitee,文末有地址 大神反馈: 零.今天完成的深红色部分 一.AOP 之 实现日志记录(服务层) 1.定义服务接口与实现类 2.在API层中添 ...
随机推荐
- JUnit——运行多个测试方法
TDD=Test Drive Development 在实际应用中作用特别大,因为我们会定义很多的类和方法,也会存在很多的更新操作,这样如果用main函数进行测试,则会异常麻烦. 而如果用这种多个 ...
- Android视频处理 --处理视频第一帧缩略图
从API 8开始,新增了一个类: android.media.ThumbnailUtils这个类提供了3个静态方法一个用来获取视频第一帧得到的Bitmap,2个对图片进行缩略处理. ? 1 publi ...
- Window、Linux查看本机外网ip
前言 我们上网用的IP并不一定是本机网卡的IP地址,由于公网IP地址稀少,国内绝大多数电脑上网,一般都是通过拨号或者端口映射.多个内网地址映射到一个公网地址来实现上网的. 目录 1.查看本机网卡ip ...
- bash脚本计算某程序的进程数
脚本里面有时候需要判断某个程序是否启动,以及有几个进程下面用nginx来做实例 显示所有的nignx进程 ps -ef|grep nginx |grep -v grep 其中grep -v grep表 ...
- 【零售App】—— react/ant design mobile项目爬坑
一.H5制作 - 图片文本的动画效果 bug:打开一个模板,添加图片,添加动画效果,若先选定动画效果,再调节动画时间和延迟时间,则动画和延迟时间没有改变:若先调节动画时间和延迟时间在选定动画效果,则动 ...
- post与get方法的区别
1. GET请求:请求的数据会附加在URL之后,以?分割URL和传输数据,多个参数用&连接.URL的编码格式采用的是ASCII编码,而不是unicode,即是说所有的非ASCII字符都要编码之 ...
- hdu 4758 (AC自动机)
除了走到哪里,还要加状态表示当前节点和已经匹配的串 #include<iostream> #include<cstdio> #include<string> #in ...
- spring中的增强类型
在spring中有两种增强方式:XML配置文件和注解配置.下面一次为大家讲解. 使用的是Aspectj第三方框架 纯POJO (在XML中配置节点) 使用@AspectJ,首先要保证所用的JDK 是5 ...
- WPF 带有提示文本的透明文本框
<TextBox Text="{Binding SearchInfo, UpdateSourceTrigger=PropertyChanged}" Grid.Row=&quo ...
- yield(),sleep()以及wait()的区别
往往混淆了这三个函数的使用. 从操作系统的角度讲,os会维护一个ready queue(就绪的线程队列).并且在某一时刻cpu只为ready queue中位于队列头部的线程服务. 但是当前正在被服务的 ...