#pragma  once
#include <windows.h>
#include <process.h>
class CLogger
{
public:
static CRITICAL_SECTION m_cs;//保证所有的对象都能访问到它
public:
CLogger();
~CLogger();
static int logger_to_file(const char* logfile);//加锁,放锁
static int logger(const char* fmt, ...);
static int close_logger_file();
private:
static int log_ref;
static FILE* logfp; }; // namespace Logger
// {
// int logger_to_file(const char* logfile);
// int logger(const char* fmt, ...);
// int close_logger_file(); // int log_ref;
// FILE* logfp;
// } #pragma once
#include "stdafx.h"
#include <stdarg.h>
#include <stdio.h>
#include <iostream>
#include <time.h>
#include "log.h"
using namespace std; int CLogger::log_ref = 0;
FILE* CLogger::logfp = NULL;
std::string get_current_time();
CRITICAL_SECTION CLogger::m_cs = {};
CLogger::CLogger()
{ }
CLogger::~CLogger()
{
close_logger_file();
}
int CLogger::logger_to_file(const char* logfile)
{
if (log_ref++ == 0) //保证只有为0打开,与关闭对应起来
{
InitializeCriticalSection(&m_cs);
logfp = fopen(logfile, "w+b");
if (!logfp)
{
log_ref--;
return -1;
}
}
return 0;
} int CLogger::logger(const char* fmt, ...)
{
EnterCriticalSection(&m_cs);
static char buffer[10240];
va_list va;
int ret = 0; va_start(va, fmt);
vsprintf(buffer, fmt, va); std::string time = get_current_time(); // 输出到文件.
if (logfp)
{
fprintf(logfp, "[%s] %s", time.c_str(), buffer);
fflush(logfp);
} // 输出到屏幕.
ret = printf("[%s] %s", time.c_str(), buffer); va_end(va); EnterCriticalSection(&m_cs);
return ret;
} int CLogger::close_logger_file()
{
if (!logfp)
return -1; if (--log_ref == 0)
{
fclose(logfp);
logfp = NULL;
DeleteCriticalSection(&m_cs);
} return 0;
} std::string get_current_time()
{
char buffer[1024] = {0};
std::string ret;
struct tm curr_time;
time_t tmp_time; time(&tmp_time); curr_time = *(localtime(&tmp_time)); if (curr_time.tm_year > 50)
{
sprintf(buffer, "%04d-%02d-%02d %02d:%02d:%02d",
curr_time.tm_year + 1900, curr_time.tm_mon + 1, curr_time.tm_mday,
curr_time.tm_hour, curr_time.tm_min, curr_time.tm_sec);
}
else
{
sprintf(buffer, "%04d-%02d-%02d %02d:%02d:%02d",
curr_time.tm_year + 2000, curr_time.tm_mon + 1, curr_time.tm_mday,
curr_time.tm_hour, curr_time.tm_min, curr_time.tm_sec);
} return std::string(buffer);
}

一个简单的log的更多相关文章

  1. VC++ 一个简单的Log类

    在软件开发中,为程序建立Log日志是很必要的,它可以记录程序运行的状态以及出错信息,方便维护和调试. 下面实现了一个简单的Log类,使用非常简单,仅供参考. // CLogHelper.h : hea ...

  2. python+selenium之自定义封装一个简单的Log类

    python+selenium之自定义封装一个简单的Log类 一. 问题分析: 我们需要封装一个简单的日志类,主要有以下内容: 1. 生成的日志文件格式是 年月日时分秒.log 2. 生成的xxx.l ...

  3. Python+Selenium中级篇之8-Python自定义封装一个简单的Log类《转载》

    Python+Selenium中级篇之8-Python自定义封装一个简单的Log类: https://blog.csdn.net/u011541946/article/details/70198676

  4. Python之自定义封装一个简单的Log类

    参考:http://www.jb51.net/article/42626.htm 参考:http://blog.csdn.net/u011541946/article/details/70198676 ...

  5. 实现一个简单的Log框架

    实际上算不上框架,只是自己对日志框架的一点理解. 核心接口:Logger,供调用者完成不同等级的日志输出 package com.lichmama.log.service; public interf ...

  6. 封装一个简单好用的打印Log的工具类And快速开发系列 10个常用工具类

    快速开发系列 10个常用工具类 http://blog.csdn.net/lmj623565791/article/details/38965311 ------------------------- ...

  7. 我的Android进阶之旅------>Android关于Log的一个简单封装

    android.util.Log类,可以方便地用于在编码调试过程中打印日志.但是在发布后的产品中,如果有太多的日志打印,则会严重地影响性能.对android.util.Log类做一个简单的封装,当产品 ...

  8. 我的Android进阶之旅------&gt;Android关于Log的一个简单封装

    android.util.Log类,能够方便地用于在编码调试过程中打印日志. 可是在公布后的产品中,假设有太多的日志打印.则会严重地影响性能. 对android.util.Log类做一个简单的封装.当 ...

  9. 使用Servlet和JSP实现一个简单的Web聊天室系统

    1 问题描述                                                利用Java EE相关技术实现一个简单的Web聊天室系统,具体要求如下. (1)编写一个登录 ...

随机推荐

  1. Only one statement is allowed per batch. A batch separator, such as 'GO', might be required between statements.

    When I added the file in VS I forgot to set Build Action = None from the file properties.

  2. GoLang之网络

    GoLang之网络 Go语言标准库里提供的net包,支持基于IP层.TCP/UDP层及更高层面(如HTTP.FTP.SMTP)的网络操作,其中用于IP层的称为Raw Socket. net包的Dial ...

  3. cookie和session的对比

    1.存放的位置     cookie存在客户端的临时文件夹     session:存在服务器的内存中,一个session域对象为一个用户浏览器服务. 2.安全性   cookie是以明文方式存放在客 ...

  4. 浅谈JavaScript中的Function引用类型

    引言 在JavaScript中最有意思的就是函数了,这一切的根源在于函数实际上是一个对象.每一个函数都是Function类型的实例,而且都和其他引用类型的实例一样具有属性和方法.函数作为一个对象,因此 ...

  5. Web 安全测试

    http://blog.sina.com.cn/s/blog_a1bbddc70101dt12.html http://blog.csdn.net/pdn2000/article/details/64 ...

  6. PHP与Javascript的混合测试

    js调用php <?php $num=88; ?> <script> var a = <?php echo $num;?>; alert(a); </scri ...

  7. Java8初体验(二)Stream语法详解

    感谢同事[天锦]的投稿.投稿请联系 tengfei@ifeve.com 上篇文章Java8初体验(一)lambda表达式语法比 较详细的介绍了lambda表达式的方方面面,细心的读者会发现那篇文章的例 ...

  8. Apache Maven 入门篇 ( 上 )

    作者:George Ma 写这个 maven 的入门篇是因为之前在一个开发者会的动手实验中发现挺多人对于 maven 不是那么了解,所以就有了这个想法. 这个入门篇分上下两篇.本文着重动手,用 mav ...

  9. 怎样让Oracle支持中文? 语言_地域.字符集

    暂时不涉及数据库业务,但是今天入库的时候中文入库报错,考虑可能是字体不支持,留待备用. 来源:Linux社区  作者:robertkun 语言_地域.字符集SIMPLIFIED CHINESE_CHI ...

  10. 昨天所写的JQ 点击隐藏事件,关键性原理

    JQ 点击隐藏事件,关键性原理 1.JQ 库的调用 一般选择为: 1)库越小越好 2)库的功能越强大越好 <script src="js/jquery.js" type=&q ...