简单的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片段必须在同步段后面,否 ...
随机推荐
- ssh报错 WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!
今天登陆远程主机的时候,出现如下的报错信息 ssh 10.0.0.1 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WAR ...
- 异常之Tomcat8
在部署新项目后,启动tomcat突然报出如下错误: 问题:Publishing failed Could not publish to the server. Cannot acquire J2EEF ...
- 输入,输出与Mad Libs游戏
name1=input('请输入一个名字') name2=input('请输入一个名字') car=input('请输入一种车子') print('饥饿的{}看到{}穿着三级甲骑着{}下山'.form ...
- 5. 箭头函数_this 指向_es6 常用语法
1. 箭头函数 函数的简写方式 () => {} 只有一个参数时,可以省略() ---- x => {} 只有一条语句时,可以省略{},此时这点语句的结果会作为函数的返回值返回 () = ...
- 20189210牟健 《Linux内核原理与分析》第二周作业
本周学习了汇编指令以及通过反汇编一个小程序来了解栈的变化 写了一个简单的C程序,如图所示: 通过gcc -s -o main.s main.c -m32指令将其编译成汇编程序 打开该汇编文件并删除不重 ...
- JavaScript Concurrency model and Event Loop 并发模型和事件循环机制
原文地址:https://developer.mozilla.org/en-US/docs/Web/JavaScript/EventLoop JavaScript 有一个基于 event loop 的 ...
- linux命令技巧
printf "%-5s %-10s %-4s\n" No Name Mark printf "%-5s %-10s %-4.2f\n" 1 Sarath 80 ...
- OO第一单元总结
OO第一单元作业总结 一.前言 开学四周,不知不觉已经做了三次OO作业.事实上,每一次作业对我来说都是很大的挑战,需要花费大量的时间和精力来学习. 虽然学得很艰苦,但最后还是连滚带爬地完成了.(好惨一 ...
- CentOS启动docker1.13失败(Job for docker.service failed because the control process exited with error code. See "systemctl status docker.service" and "journalctl -xe" for details.)
一.启动失败 1.启动docker [root@localhost ~]# systemctl start docker Job for docker.service failed because t ...
- lcr电桥浅谈
此图告知,现代的lcr电桥使用的都是虚地,阻抗很高. 系统采用的鉴相器比较简单,是检半个正弦基波(RMS有效值积分),可以有效抵御偶次基波. 倒不如直接使用运放电容移相,比较采样法直接采样最高点. 此 ...