#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. swiper 增加同页面增加2个滚动

    js代码 <script type="text/javascript"> var mySwiper = new Swiper('.slide_a',{ noSwipin ...

  2. js控制全屏窗口

    <script src="__PUBLIC__/Js/jquery.min.js"></script> <script type="text ...

  3. (转载)iOS UILabel自定义行间距时获取高度

    本文介绍一下自定义行间距的UILabel的高度如何获取,需要借助一下开源的UILabel控件:TTTAttributedLabel 附下载地址 https://github.com/TTTAttrib ...

  4. Tomcat服务器原理详解

    [目录]本文主要讲解Tomcat启动和部署webapp时的原理和过程,以及其使用的配置文件的详解.主要有三大部分: 第一部分.Tomcat的简介和启动过程 第二部分.Tomcat部署webapp 第三 ...

  5. jQ控制前端输入用户为空是的提醒

    1.在jQ中$(function(){})函数的意思是 $(document).ready(function(){}) 的简写,用来在DOM加载完成之后执行一系列预先定义好的函数 placeholde ...

  6. 使用Fluent API 配置/映射属性和类型

    Code First约定-Fluent API配置 使用Fluent API 配置/映射属性和类型 简介 通常通过重写派生DbContext 上的OnModelCreating 方法来访问Code F ...

  7. strtoull函数的使用,及相关信息汇总

    kafka中涉及到序列化,有一个参数是在发送消息实体前边以一个序列号打头, seq = strtoull((prdcfgval+1), NULL, 10); do_seq = 1; 其中(prdcfg ...

  8. php 遍历目录下的所以文件和文件夹

    <?php/** * 遍历文件夹和文件列 * @author lizhiming * @date 2016/06/30 */define('DS', DIRECTORY_SEPARATOR); ...

  9. standford工具-parser

    stanford自然语言处理开源了很多工具,很实用也很方便,记录下来,以备后用. 第一篇就从句法分析开始吧(所用的平台都是java+eclipse). <一>操作 1.http://www ...

  10. 知识梳理HTML篇

    HTML 浏览器内核: IE:trident         Firefox : gecko        Safari/chrome : webkit        Opera : presto(新 ...