一个多线程的日志记录DLL

日志记录对于应用程序来说是很重要的。本文就简单实现的实现了这样一个模块。该模块实现对程序预期的信息进行记录的功能。该模块为每一个向它进行注册的模块开启一个线程并同时创建或者打开一个同名但扩展名为.log的文本文件,此文件位于程序可执行文件目录下的/Log子目录下。这样也具有了一定的灵活性,比如可以再Debug版本中用此库输出调试信息到文件,而在Release版本中真正用于记录日志信息。

下面对其中的两个类的接口介绍一下:

CInfoReport:

该类在实现时已经用AFX_EXT_CLASS关键字指明,是一个DLL导出类,继承自CObject。

数据成员:

// 存放线程的指针链表,所有对象公用一份,故声明为static
static CPtrList m_lstpThreads;

成员函数:

// 注册模块
DWORD Register(LPCTSTR ModuleNameToReg);
// 写入信息,其中的第一个参数MoudleID必须是Register函数的返回值,
// 如果为NULL则将信息记录到FatalErr.log文件中。
void WriteInfo(DWORD MoudleID, CString InfoDescribe);
// 写入信息,其中的第一个参数MoudleID必须是Register函数的返回值,
// 如果为NULL则将信息记录到FatalErr.log文件中。
void WriteInfo(DWORD MoudleID, CString InfoFrom, CString InfoDescribe);

CWriteInfo:

该类继承自CWinThread,用于为每一个已注册的模块开启一个线程并且维护一个扩展名为log的日志文件。因为可能有多个线程同时进行同一文件操作,故此类还提供了互斥机制来确保文件I/O无冲突的进行。

数据成员:

// 注册的模块名,日志文件与它同名但扩展名不同
CString m_strModuleName;
CFile m_file; // 日志文件对象
// 为实现文件互斥操作的事件句柄
HANDLE m_hEventBusy;

成员函数:

// GetName()和SetModuleFileName()对私有成员m_strModuleName进行存取。
CString GetName();
void SetModuleFileName(CString strFileName);

消息处理函数:

// 处理由CInfoReport::WriteInfo()发来的消息TM_WRITE_INFO
afx_msg void OnWriteInfo(WPARAM wParam, LPARAM lParam);

注:未尽事项请参考源代码,包括库本身以及一个测试程序InfoReportTest。简单起见,测试程序(一个文档/视的SDI程序)的视图类的OnDraw()函数里调用了该库的日志记录函数。

程序需要完善的地方

该程序在匆忙之间完成,还有问题没有解决:

1. 安全性检查,比如可执行文件的目录下没有/Log子目录,程序将产生异常。

2. 该程序的导出类在EXE文件中被作为全局变量没有问题,而在DLL中作为全局变量应用则会导致没有反应,跟踪发现是由于创建新线程时在::WaitForSingleObject()处僵死,作为局部变量(类的成员变量使用则没有问题)。

本文配套源码

时间: 2025-01-26 13:02:43

一个多线程的日志记录DLL的相关文章

spring aop面向切面编程:如何来做一个强大的日志记录功能

这个东西怎么做:spring aop 面向切面编程 如何来做一个强大的日志记录功能模板; 昨天经理把这个任务交给我,让我为公司现在的项目加上一个详细的日志记录功能模板,对所有的操作,至少是增删改运作进行一个记录,其要记录操作者,以及执行的方法,IP,以及操作的方法的参数. 我以前做过类似的功能,不过是在filter里做的,通过filter来检查action请求,记录请求中的参数及action名字.但是今天公司这个是要求用spring aop来做,这样就可以在spring里对要进行的日志记录方法进

一个真正的热插拔开源的日志记录组件

前两天发现一个开源日志组件ELMAH,一下子就喜欢上了,喜欢他的原因是它支持"热插拔"(不需要改动任何的程序).简单的配置(几行配置).多种记录方式(数据库.文件.Email).支持多数据库(Access.SqlServer.Oracle.Sqlite.VistaDB),而且查看结果也不需要编写(并且支持rss发布查看). ELMAH最新版本是ELMAH-1.0-BETA3,他是基于HttpModules.HttpHandlers的处理方式,只是记录错误日志不进行处理,不过这已经足够了

Juniper防火墙的日志记录一个的问题

今天看了一下机房的防火墙,突然一段连续且短的但是很明显的英文通过我的眼睛进入了我的大脑,有点儿不对劲儿,打开详细内容看看. SIP parser error Message: Cannot find CRLF SIP parser error Message: Cannot find CRLF SIP parser error Message: Cannot find CRLF SIP parser error Message: Cannot find CRLF SIP parser error

如何设计一个高性能的日志系统

问题描述 如何设计一个高性能的日志系统 需求: 1.系统采用B/S架构,要求能够记录客户端的任何事件,比如单击了某个按钮或者链接: 2.要求能够记录用户每次操作时后台代码使用到的SQL和参数,比如添加数据时的SQL语句和具体的Parameter: 3.将1和2串联或者合并起来,意思就是我在分析日志时,能够在查询客户端事件时也能看到后台的SQL语句和参数: 4.2年内数据达到20亿条记录,采用什么样的数据库比较合适,非关系行的MongoDB还是关系型的Oracle: 解决方案 4.什么数据库都没关

.net jMail邮件发送(含抄送、密送、多发、日志记录)实例代码_实用技巧

jmail是一个第三方邮件操作组件,通常位于web服务器端,实现收邮件及发邮件功能(客户端用Foxmail这类就很好了).可以利用它轻松实现发邮件.抄送.密送.多发.日志记录及收邮件功能.本章要讲的,就是:发邮件.抄送.密送.多发.日志记录. 一.组件准备下载JMail44_pro并安装(记下安装路径) 找到安装路径,将其中的jmail.dll复制到项目中 二.核心发送代码新建MailAPI.cs,并输入以下代码 复制代码 代码如下: using System;using System.Coll

C++日志记录类实例解析_C 语言

本文所述实例是从一个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

MVC使用Log4Net进行错误日志记录学习笔记4_实用技巧

在Web应用运行过程中,我们难免会遇到程序运行异常,这个时候我们就应该将异常信息记录下来,以便开发人员和维护人员对异常原因进行还原,对异常原因进行修复.在ASP.NET平台中进行日志记录的组件也有很多,如Log4Net.CommonLogging等,我们这里选用Log4Net进行异常日志的记录. 1. 捕获异常 在ASP.NET MVC中提供了一个全局的异常处理过滤器:HandleErrorAttribute,可以通过该过滤器捕获异常信息. 我们在Models文件夹下新建类型Log4Except

Log4Net日志记录两种方式

本文转载:http://www.cnblogs.com/wolf-sun/p/3347373.html#3009010 简介      log4net库是Apache log4j框架在Microsoft .NET平台的实现,是一个帮助程序员将日志信息输出到各种目标(控制台.文件.数据库等)的工具.     log4net是Apache软件基金会Apache Logging Services工程的一部分.Apache日志服务工程致力于为程序调试和审计提供跨语言的日志服务.(f:百度百科) 原理  

【转】使用Log4Net进行日志记录

     首先说说为什么要进行日志记录.在一个完整的程序系统里面,日志系统是一个非常重要的功能组成部分.它可以记录下系统所产生的所有行为,并按照某种规范表达出来.我们可以使用日志系统所记录的信息为系统进行排错,优化系统的性能,或者根据这些信息调整系统的行为.      Log4net是一个很著名的开源的日志记录组件.官方网址为:http://logging.apache.org/log4net/ ,使用Log4net能够很简单的为我们的程序添加日志记录功能.下面我们先通过一个网站例子来说明如何在