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++输出日志的更多相关文章

  1. log4j输出日志乱码(转)

    log4j日志文件乱码问题的解决方法 log4j日志文件中文乱码处理方法 log4j 控制台和文件输出乱码问题解决 写在前面,第三篇文章中将原因解释的最清楚,为什么设置为UTF-8或者GBK就生效了, ...

  2. Myeclipse集成Jboss 6.1控制台不输出日志信息

    在使用myeclipse+jboss 6.1开发的时候发现jboss能够正常启动但是myeclipse的控制台却没有任何的信息输出,这使得我没有办法开发,在查找了大部分的资料发现很多说要改什么jbos ...

  3. 如何在Android SDK 下查看应用程序输出日志的方法

          该文章源于安卓教程网(http://android.662p.com),转载时要注明文章的来自和地址,感谢你的支持. 在Android程序中可以使用 android.util.Log 类来 ...

  4. 怎样在Android SDK 下查看应用程序输出日志的方法

          该文章源于安卓教程网(http://android.662p.com),转载时要注明文章的来自和地址,感谢你的支持. 在Android程序中可以使用 android.util.Log 类来 ...

  5. LogCook 一个简单实用的Android日志管理工具

    众所周知,日志的管理是软件系统很重要的一部分,千万不可忽略其重要性.完整的日志将会在系统维护中起着异常重要的作用,就好像磨刀不误砍柴工一样,日志就像对系统进行分析的工具,工具便捷了,对系统分析起来就能 ...

  6. ASP.NET Core 集成测试中通过 Serilog 向控制台输出日志

    日志是程序员的雷达,不仅在生产环境中需要,在集成测试环境中也需要,可以在持续集成失败后帮助定位问题.与生产环境不同,在集成测试环境中使用控制台输出日志更方便,这样可以通过持续集成 runner 执行 ...

  7. 一个简单好用的日志框架NLog

    之前我介绍过如何使用log4net来记录日志,但最近喜欢上了另一个简单好用的日志框架NLog. 关于NLog和log4net的比较这里就不多讨论了,感兴趣的朋友可以参看.NET日志工具介绍和log4n ...

  8. logback不输出日志消息,且SLF4J绑定源错误

    我之前的项目已经成功使用过logback作为日志输出,但是今天新项目在使用的时候,不输出日志信息. 最后终于找到问题所在,并成功解决.解决步骤如下: 第一步:检查pom.xml 按照以往惯例,我先检查 ...

  9. logback异步输出日志(生产者消费者模型),并非批量写入日志。

    一直对logback异步输出日志误解为异步批量写入日志. 今天看了源代码. 首先logback的异步日志是如何配置的: <!-- 管理端用户行为日志异步输出,异步的log片段必须在同步段后面,否 ...

随机推荐

  1. json,HTTP协议

    JSON 语法规则 JSON 语法是 JavaScript 对象表示语法的子集. 数据在名称/值对中 数据由逗号分隔 大括号保存对象 中括号保存数组 JSON 对象 JSON 对象使用在大括号({}) ...

  2. String,StringBuffer,StringBudilder区别--2019-04-13

    String,StringBuffer,StringBudilder区别: 1String 是字符串常量,创建内容不可以变, final修饰意味着String类型不能被继承,减少被修改的可能,从而最大 ...

  3. 树莓派开启samba服务

    安装samba 和 samba-common-bin 启动树莓派以后,在命令行输入: sudo apt-get update sudo apt-get install samba samba-comm ...

  4. BZOJ.4299.Codechef FRBSUM(主席树)

    题目链接 记mx为最大的满足1~mx都能组成的数. 考虑当前能构成1~v中的所有数,再加入一个数x,若x>v+1,则mx=v,x不会产生影响:否则x<=v+1,则新的mx=x+v. 对于区 ...

  5. Python线性表——单链表

    1. 线性表简介 线性表是一种线性结构,它是由零个或多个数据元素构成的有限序列.线性表的特征是在一个序列中,除了头尾元素,每个元素都有且只有一个直接前驱,有且只有一个直接后继,而序列头元素没有直接前驱 ...

  6. Urozero Autumn 2016. BAPC 2016

    A. Airport Logistics 根据光路最快原理以及斯涅尔定律,可以得到从定点$P$进入某条直线的最佳入射角. 求出每个端点到每条线段的最佳点,建图求最短路即可. 时间复杂度$O(n^2\l ...

  7. Lesnoe Ozero 2016. BSUIR Open 2016 Finals

    A. Street magic 数位DP,设$f[i][j][k]$表示从低到高考虑$x$的后$i$位,$x$和$m$大小关系为$j$,和$n$大小关系为$k$的方案数. #include<cs ...

  8. 最大子矩阵和问题dp

    给定一个矩阵 matrix,其中矩阵中的元素可以包含正数.负数.和0,返回子矩阵的最大累加和.例如,矩阵 matrix 为: 0 -2 -7 0 9 2 -6 2 -4 1 -4 1 -1 8 0 - ...

  9. HttpHandler和ashx使用Session 出现未初始化异常

    原因: HttpHandler和ashx要实现IRequiresSessionState接口才能访问Session信息 接口IRequiresSessionState: 指定目标 HTTP 处理程序需 ...

  10. __x__(4)0905第二天__软件架构

    软件架构 C/S 架构,客户端/服务器,用户通过客户端使用软件. 一般的应用软件都是 C/S 架构,如 QQ,360 等等. C 为 Client,用户电脑使用的软件. S 为 Server,服务器, ...