简单的C++输出日志
myLog.h
#ifndef __myLog_H_
#define __myLog_H_
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <string> #include <iostream>
#include <ratio>
#include <chrono>
#include <mutex> std::string GetName(char * fileName); std::string getCurrentSystemTime(); long long getCurrentMs();
// 初始化路径
int LOGINIT(char *path);
// 结束时候调用
int LOGEnd();
// 设置最大日志文件,默认5M, mSize单位是字节
int LOGSetMaxSpace(int mSize); int logWrite(char * s); #define LOGE(...) {\
char temp[] = {}; \
sprintf(temp, "%s", getCurrentSystemTime().c_str()); \
sprintf(temp+strlen(temp), " %s %d ", GetName(__FILE__).c_str(), __LINE__); \
sprintf(temp+strlen(temp), __VA_ARGS__); \
sprintf(temp + strlen(temp), "\n"); \
printf("%s", temp); \
logWrite(temp); \
}
#endif
myLog.cpp
#include "myLog.h" std::mutex mux;
static FILE * fp = NULL;
int MaxLenChar = * * ; // 5 M 数据 int LOGINIT(char *path)
{
fp = fopen(path, "w+");
if (fp == NULL)
{
return -;
}
return ;
}
int LOGSetMaxSpace(int mSize)
{
MaxLenChar = mSize;
return ;
} int logWrite(char * s)
{
if (fp)
{
int len = ftell(fp);
if (len > MaxLenChar)
{
LOGEnd();
return ;
}
mux.lock();
fprintf(fp, "%s", s);
fflush(fp);
mux.unlock();
} return ;
} int LOGEnd()
{
if (fp)
{
fflush(fp);
fclose(fp);
fp = ;
}
return ;
} std::string getCurrentSystemTime()
{
auto time_now = std::chrono::system_clock::now();
auto tt = std::chrono::system_clock::to_time_t(time_now);
auto duration_in_ms = std::chrono::duration_cast<std::chrono::milliseconds>(time_now.time_since_epoch());
auto duration_in_s = std::chrono::duration_cast<std::chrono::seconds>(time_now.time_since_epoch());
int theMs = duration_in_ms.count() - duration_in_s.count() * ;
struct tm* ptm = localtime(&tt); char date[] = { };
sprintf(date, "%d-%02d-%02d-%02d.%02d.%02d.%03d%",
(int)ptm->tm_year + , (int)ptm->tm_mon + , (int)ptm->tm_mday,
(int)ptm->tm_hour, (int)ptm->tm_min, (int)ptm->tm_sec, theMs);
return std::string(date);
}
long long getCurrentMs()
{
auto time_now = std::chrono::system_clock::now();
auto duration_in_ms = std::chrono::duration_cast<std::chrono::milliseconds>(time_now.time_since_epoch()); return duration_in_ms.count();
}
std::string GetName(char * fileName)
{
char temp[] = { };
memcpy(temp, fileName, strlen(fileName) + ); std::string sName = temp; #ifdef WIN32
int startP = sName.find_last_of("\\");
if (startP == -)
{
startP = ;
}
std::string theLastName = sName.substr(startP + , sName.size() - startP); #else
int startP = sName.find_last_of("/");
if (startP == -)
{
startP = ;
}
std::string theLastName = sName.substr(startP + , sName.size() - startP); #endif
return theLastName;
}
mian.cpp
#include<stdio.h>
#include "myLog.h" LOGINIT("mylog.log") int main()
{
int age=;
char name[]="fly"; LOGE("My name is %s,I am %d years old.", name,age); LOGEnd(); return ;
}
简单的C++输出日志的更多相关文章
- log4j输出日志乱码(转)
log4j日志文件乱码问题的解决方法 log4j日志文件中文乱码处理方法 log4j 控制台和文件输出乱码问题解决 写在前面,第三篇文章中将原因解释的最清楚,为什么设置为UTF-8或者GBK就生效了, ...
- Myeclipse集成Jboss 6.1控制台不输出日志信息
在使用myeclipse+jboss 6.1开发的时候发现jboss能够正常启动但是myeclipse的控制台却没有任何的信息输出,这使得我没有办法开发,在查找了大部分的资料发现很多说要改什么jbos ...
- 如何在Android SDK 下查看应用程序输出日志的方法
该文章源于安卓教程网(http://android.662p.com),转载时要注明文章的来自和地址,感谢你的支持. 在Android程序中可以使用 android.util.Log 类来 ...
- 怎样在Android SDK 下查看应用程序输出日志的方法
该文章源于安卓教程网(http://android.662p.com),转载时要注明文章的来自和地址,感谢你的支持. 在Android程序中可以使用 android.util.Log 类来 ...
- LogCook 一个简单实用的Android日志管理工具
众所周知,日志的管理是软件系统很重要的一部分,千万不可忽略其重要性.完整的日志将会在系统维护中起着异常重要的作用,就好像磨刀不误砍柴工一样,日志就像对系统进行分析的工具,工具便捷了,对系统分析起来就能 ...
- ASP.NET Core 集成测试中通过 Serilog 向控制台输出日志
日志是程序员的雷达,不仅在生产环境中需要,在集成测试环境中也需要,可以在持续集成失败后帮助定位问题.与生产环境不同,在集成测试环境中使用控制台输出日志更方便,这样可以通过持续集成 runner 执行 ...
- 一个简单好用的日志框架NLog
之前我介绍过如何使用log4net来记录日志,但最近喜欢上了另一个简单好用的日志框架NLog. 关于NLog和log4net的比较这里就不多讨论了,感兴趣的朋友可以参看.NET日志工具介绍和log4n ...
- logback不输出日志消息,且SLF4J绑定源错误
我之前的项目已经成功使用过logback作为日志输出,但是今天新项目在使用的时候,不输出日志信息. 最后终于找到问题所在,并成功解决.解决步骤如下: 第一步:检查pom.xml 按照以往惯例,我先检查 ...
- logback异步输出日志(生产者消费者模型),并非批量写入日志。
一直对logback异步输出日志误解为异步批量写入日志. 今天看了源代码. 首先logback的异步日志是如何配置的: <!-- 管理端用户行为日志异步输出,异步的log片段必须在同步段后面,否 ...
随机推荐
- 利用MySQL游标进行计算排名
SELECT a.id, a.nick_name, a.member_account, a.integral, () AS tRank #计算行号 FROM tzqc_raw_data AS a, ( ...
- 咸鱼入门到放弃5--Session和Cookie
保存会话数据的两种技术 1.Cookie Cookie是客户端技术,程序把每个用户的数据以cookie的形式写给用户各自的浏览器.当用户使用浏览器再去访问服务器中的web资源时,就会带着各自的数据去. ...
- P1341 无序字母对 欧拉回路
题目描述 给定n个各不相同的无序字母对(区分大小写,无序即字母对中的两个字母可以位置颠倒).请构造一个有n+1个字母的字符串使得每个字母对都在这个字符串中出现. 输入输出格式 输入格式: 第一行输入一 ...
- 详述 hosts 文件的作用及修改 hosts 文件的方法
1 什么是hosts文件? hosts是一个没有扩展名的系统文件,其基本作用就是将一些常用的网址域名与其对应的 IP 地址建立一个关联“ 数据库 ”.当用户在浏览器中输入一个需要登录的网址时,系统会首 ...
- Kali Linux常用服务配置教程获取IP地址
Kali Linux常用服务配置教程获取IP地址 下面以Kali Linux为例,演示获取IP地址的方法 (1)设置网络接口为自动获取IP地址.在Kali Linux的收藏夹中单击图标,将显示所有的程 ...
- 动态规划——Edit Distance
大意:给定两个字符串word1和word2,为了使word1变为word2,可以进行增加.删除.替换字符三种操作,请输出操作的最少次数 Example 1: Input: word1 = &quo ...
- IDEA 2018.2.5最新版破解到2100年图解教程
先看下我破解后的效果图 把下载的破解补丁放在你的idea的安装目录下的bin的目录下面(如下图所示),本文示例为F:\ProgramFiles\JetBrains\IntelliJ IDEA 2018 ...
- git使用习惯
1.每早一更新,提交前更新 git pull -u origin master: master(master为分支名称) 2.每晚一提交: git add . (注:别忘记后面的.此操作是把文件夹下面 ...
- 对Spring 的RestTemplate进行包装
Spring的RestTemplate及大地简化了REST Client的开发,但每次还要编写大量的模板代码,代码不够简洁.我对他进行了一次包装,采用接口来声明REST接口,使用Annotation对 ...
- ubuntu重复登录问题
第一次遇到: 昨天好不容易装好了驱动,紧接着装了CUDA,cuDNN,Anaconda,VSCode等等.然后安装pytorch的时候遇到了下载的问题,后来也算搞定了.但是在更换了显示器后重启(好像是 ...