本文所述实例是从一个Red Hat开源项目里面扒出来的,非常实用!读者还可以根据自身需求加以修改!完整源码如下:
Log.h文件部分:
#ifndef __LOG_H__ #define __LOG_H__ #include <stdio.h> #include <tchar.h> #include <crtdbg.h> #include <windows.h> #include <time.h> #include <sys/timeb.h> class CLog { public: ~CLog(); static CLog* get(TCHAR* path = NULL); void printf(const char* format, ...); private: CLog(FILE* handle); private: static CLog* _log; FILE* _handle; }; enum { LOG_DEBUG, LOG_INFO, LOG_WARN, LOG_ERROR, LOG_FATAL }; #ifdef _DEBUG static unsigned int log_level = LOG_DEBUG; #else static unsigned int log_level = LOG_INFO; #endif #define PRINT_LINE(type, format, datetime, ms, ...) \ printf("%lu::%s::%s,%.3d::%s::" format "\n", GetCurrentThreadId(), type, datetime, ms, \ __FUNCTION__, ## __VA_ARGS__); #define LOG(type, format, ...) do { \ if (type >= log_level && type <= LOG_FATAL) { \ CLog* log = CLog::get(); \ const char *type_as_char[] = { "DEBUG", "INFO", "WARN", "ERROR", "FATAL" }; \ struct _timeb now; \ struct tm today; \ char datetime_str[20]; \ _ftime_s(&now); \ localtime_s(&today, &now.time); \ strftime(datetime_str, 20, "%Y-%m-%d %H:%M:%S", &today); \ if (log) { \ log->PRINT_LINE(type_as_char[type], format, datetime_str, now.millitm, ## __VA_ARGS__); \ } else { \ PRINT_LINE(type_as_char[type], format, datetime_str, now.millitm, ## __VA_ARGS__); \ } \ } \ } while(0) #define log_printf(format, ...) LOG(LOG_INFO, format, ## __VA_ARGS__) #define LOG_INFO(format, ...) LOG(LOG_INFO, format, ## __VA_ARGS__) #define LOG_WARN(format, ...) LOG(LOG_WARN, format, ## __VA_ARGS__) #define LOG_ERROR(format, ...) LOG(LOG_ERROR, format, ## __VA_ARGS__) #define DBGLEVEL 1000 #define DBG(level, format, ...) do { \ if (level <= DBGLEVEL) { \ LOG(LOG_DEBUG, format, ## __VA_ARGS__); \ } \ } while(0) #define ASSERT(x) _ASSERTE(x) #endif
Log.cpp文件部分:
#include "Log.h" #include <stdio.h> #include <stdarg.h> #include <share.h> #define LOG_ROLL_SIZE (1024 * 1024) CLog* CLog::_log = NULL; CLog::CLog(FILE* handle) : _handle(handle) { _log = this; } CLog::~CLog() { if (_log && _handle) { fclose(_handle); _log = NULL; } } CLog* CLog::get(char* path) { if (_log) { return _log; } if(!path) { path = "dll.log"; } DWORD size = 0; HANDLE file = CreateFile(path, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (file != INVALID_HANDLE_VALUE) { size = GetFileSize(file, NULL); CloseHandle(file); } if (size != INVALID_FILE_SIZE && size > LOG_ROLL_SIZE) { TCHAR roll_path[MAX_PATH]; sprintf(roll_path, "%s.1", path); if (!MoveFileEx(path, roll_path, MOVEFILE_REPLACE_EXISTING)) { return NULL; } } FILE* handle = fopen(path, "a+"); if (!handle) { return NULL; } _log = new CLog(handle); return _log; } void CLog::printf(const char* format, ...) { va_list args; va_start(args, format); vfprintf(_handle, format, args); va_end(args); fflush(_handle); }
本文向大家介绍C#写日志类实例,包括了C#写日志类实例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#写日志类,分享给大家供大家参考。 具体实现方法如下: 希望本文所述对大家的C#程序设计有所帮助。
我想在我的应用程序中使用SLF4J+logback用于两个目的--日志和审计。 14:41:57.978[main]信息AUDIT_LOGGER-110欢迎使用main 如何确保审核消息在审核记录器下只出现一次?
问题内容: 我正在考虑将Redis用于Web应用程序日志记录目的。我用谷歌搜索,有人将日志转储到Redis队列/列表中,然后将计划的工作人员转储到磁盘中。 http://nosql.mypopescu.com/post/8652869828/another-redis-use-case- centralized-logging 我希望寻求理解,为什么不直接使用Redis持久化到磁盘?如果我分配了一
logging 模块自 2.3 版以来一直是 Python 标准库的一部分。在 PEP 282 中有对它的简洁描述。除了 基础日志教程 之外,这些文档是非常难以阅读的。 日志记录一般有两个目的: 诊断日志 记录与应用程序操作相关的日志。例如,当用户遇到程序报错时, 可通过搜索诊断日志以获得上下文信息。 审计日志 为商业分析而记录的日志。从审计日志中,可提取用户的交易信息, 并结合其他用户资料构成用
本文向大家介绍C#生成word记录实例解析,包括了C#生成word记录实例解析的使用技巧和注意事项,需要的朋友参考一下 本文以实例形式讲述了C#生成Word记录的方法,具体实现代码如下: 使用模板生成通用格式Word文件: 如果您要使用自动化功能创建的文档都是通用格式,则利用基于预设格式的模板的新文档来开始创建过程会更加容易。与从头创建文档相比,将某个模板与 Word 自动化客户端配合使用有两大优
本文向大家介绍python日志记录模块实例及改进,包括了python日志记录模块实例及改进的使用技巧和注意事项,需要的朋友参考一下 python 打印对象的所有属性值: Python logger对象属性(由上述函数获取的) 部分日志无法输出 File:logger.conf File:logger.py 问题一:测试过程中,只能打印出test_logger function一条语句 问题二:明明