一个简单的log
#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的更多相关文章
- VC++ 一个简单的Log类
在软件开发中,为程序建立Log日志是很必要的,它可以记录程序运行的状态以及出错信息,方便维护和调试. 下面实现了一个简单的Log类,使用非常简单,仅供参考. // CLogHelper.h : hea ...
- python+selenium之自定义封装一个简单的Log类
python+selenium之自定义封装一个简单的Log类 一. 问题分析: 我们需要封装一个简单的日志类,主要有以下内容: 1. 生成的日志文件格式是 年月日时分秒.log 2. 生成的xxx.l ...
- Python+Selenium中级篇之8-Python自定义封装一个简单的Log类《转载》
Python+Selenium中级篇之8-Python自定义封装一个简单的Log类: https://blog.csdn.net/u011541946/article/details/70198676
- Python之自定义封装一个简单的Log类
参考:http://www.jb51.net/article/42626.htm 参考:http://blog.csdn.net/u011541946/article/details/70198676 ...
- 实现一个简单的Log框架
实际上算不上框架,只是自己对日志框架的一点理解. 核心接口:Logger,供调用者完成不同等级的日志输出 package com.lichmama.log.service; public interf ...
- 封装一个简单好用的打印Log的工具类And快速开发系列 10个常用工具类
快速开发系列 10个常用工具类 http://blog.csdn.net/lmj623565791/article/details/38965311 ------------------------- ...
- 我的Android进阶之旅------>Android关于Log的一个简单封装
android.util.Log类,可以方便地用于在编码调试过程中打印日志.但是在发布后的产品中,如果有太多的日志打印,则会严重地影响性能.对android.util.Log类做一个简单的封装,当产品 ...
- 我的Android进阶之旅------>Android关于Log的一个简单封装
android.util.Log类,能够方便地用于在编码调试过程中打印日志. 可是在公布后的产品中,假设有太多的日志打印.则会严重地影响性能. 对android.util.Log类做一个简单的封装.当 ...
- 使用Servlet和JSP实现一个简单的Web聊天室系统
1 问题描述 利用Java EE相关技术实现一个简单的Web聊天室系统,具体要求如下. (1)编写一个登录 ...
随机推荐
- TeXmacs - 所见即所得 - 专业排版软件
所见即所得,支持中文,很好用, 容易奔溃,奔溃进入不了程序时,删除文件夹 C:\Users\Perelman\AppData\Roaming\TeXmacs
- CentOS6.5个人目录下中文路径转英文路径
如果安装了中文版到CentOS之后,root目录及home目录下会出现中文到路径名,如“桌面”.“文档”,“图片 .公共的” .“下载”. “音乐”.“ 视频”等目录,这样在命令行上操作十分到不方便. ...
- UITextField限制输入文字
一.viewDidLoad时监听通知 NSNotificationCenter *center = [NSNotificationCenter defaultCenter]; [center addO ...
- Http常用状态码
HTTP状态码(HTTP Status Code) 一些常见的状态码为: 200 - 服务器成功返回网页 404 - 请求的网页不存在 503 - 服务不可用 所有状态解释:点击查看 1xx(临时响应 ...
- 居于Web的进度条实现思路(下载百分比)
http://www.cnblogs.com/wfyfngu/p/4866434.html 在传统桌面项目中,进度条随处可见,但作为一个很好的用户体验,却没有在如今主流的B/S程序中得到传承,不能不说 ...
- 登录验证码编写(jsp+servlet+dao)
一.什么是验证码及它的作用 验证码为全自动区分计算机和人类的图灵测试的缩写,是一种区分用户是计算机的公共全自动程序,这个问题可以由计算机生成并评判,但是必须只有人类才能解答. 可以防止恶意破解密码.刷 ...
- VS Code 开发asp.net core 遇到的坑
摘要 微软发布.NET Core 1.0,ASP.NET Core 1.0 与 Entity Framewok 1.0也有一段时间了,一直没进行这方面的学习,节前公司让调研这方面的可行性.所以还是从最 ...
- Linux服务器管理: RPM包
服务安装类型主要分两种: RPM安装和源码包编译安装: 1.RPM包查看: rpm -qa | grep 包名 用chkconfig --list 查看服务自启动命令 只对RPM包安装的服务生效 ...
- 密码学初级教程(六)数字签名 Digital Signature
密码学家工具箱中的6个重要的工具: 对称密码 公钥密码 单向散列函数 消息认证码 数字签名 伪随机数生成器 提问: 有了消息认证码为什么还要有数字签名? 因为消息认证码无法防止否认.消息认证码可以识别 ...
- WebApi常见4xx错误总结!!!
iis 7上发布mvc报错:403.14-Forbidden Web 服务器被配置为不列出此目录的内容 折腾了半天,提示里面的解决方法是: 如果不希望启用目录浏览,请确保配置了默认文档并且该文件存在. ...