Delphi应用程序日志写入系统日志
2012-09-27 21:05
267 查看
1、首先要写一个文本类型的消息文件,格式如下:
//==== 文件格式 SystemLog.mc=========
LanguageNames=(English=0x409:LicenseServer_en)
LanguageNames=(Chinese=0x411:LicenseServer_cn)
MessageId=1000
SymbolicName = EVMSG_INFORMATION
Language=English
CommomMessage:%1
.
LanguageNames=(Chinese=2052:MSG0052)
MessageId =1001
SymbolicName = EVMSG_INFORMATION
Language=English
ErrorMessage:%1
.
//=======================
说明:默认的语言是英语,此时"LanguageNames="那句可以省略;
%1,%2等表示从ReportEvent传来的参数;
如果使用中文,在文件最初定义
LanguageNames=((Chinese=0x411:LicenseServer_cn)//0x411为CodePage,LicenseServer_cn为定义文件名称(mc输出的.bin文件)。然后替换基本格式中的Language字段,如下Language=Chinese
文件必须以一个空行结束,即在最后一个信息定义块的 '.' 后加回车换行
2、使用mc编译此SystemLog.mc文件
① mc.exe是VC带的工具,路径参考:
C:\Program Files\Microsoft SDKs\windows\v6.0A\Bin
② 进dos,使用mc编译文件。如果你的项目使用UNICODE,如下:mc myevt.mc;否则必须加入命令选项:mc myevt.mc -A。将生成的三个文件SystemLog.rc SystemLog.h SystemLog.bin。
3、把rc文件转化成res文件
brcc32 D:\PQXSource\SystemLog\Res\LicenseServerLog.rc
4、在注册表中添加事件源
HKEY_LOCAL_MACHINE
SYSTEM
CurrentControlSet
Services
EventLog
Application
AppName
5、把res文件添加到Delphi工程
具体代码如下:
下载源代码:SystemLog.rar
//==== 文件格式 SystemLog.mc=========
LanguageNames=(English=0x409:LicenseServer_en)
LanguageNames=(Chinese=0x411:LicenseServer_cn)
MessageId=1000
SymbolicName = EVMSG_INFORMATION
Language=English
CommomMessage:%1
.
LanguageNames=(Chinese=2052:MSG0052)
MessageId =1001
SymbolicName = EVMSG_INFORMATION
Language=English
ErrorMessage:%1
.
//=======================
说明:默认的语言是英语,此时"LanguageNames="那句可以省略;
%1,%2等表示从ReportEvent传来的参数;
如果使用中文,在文件最初定义
LanguageNames=((Chinese=0x411:LicenseServer_cn)//0x411为CodePage,LicenseServer_cn为定义文件名称(mc输出的.bin文件)。然后替换基本格式中的Language字段,如下Language=Chinese
文件必须以一个空行结束,即在最后一个信息定义块的 '.' 后加回车换行
2、使用mc编译此SystemLog.mc文件
① mc.exe是VC带的工具,路径参考:
C:\Program Files\Microsoft SDKs\windows\v6.0A\Bin
② 进dos,使用mc编译文件。如果你的项目使用UNICODE,如下:mc myevt.mc;否则必须加入命令选项:mc myevt.mc -A。将生成的三个文件SystemLog.rc SystemLog.h SystemLog.bin。
3、把rc文件转化成res文件
brcc32 D:\PQXSource\SystemLog\Res\LicenseServerLog.rc
4、在注册表中添加事件源
HKEY_LOCAL_MACHINE
SYSTEM
CurrentControlSet
Services
EventLog
Application
AppName
5、把res文件添加到Delphi工程
具体代码如下:
program SystemLog; uses Vcl.SvcMgr, ServerMain in 'ServerMain.pas' {SystemLogService: TService}; {$R *.RES} {$R SystemLog.res} begin // Windows 2003 Server requires StartServiceCtrlDispatcher to be // called before CoRegisterClassObject, which can be called indirectly // by Application.Initialize. TServiceApplication.DelayInitialize allows // Application.Initialize to be called from TService.Main (after // StartServiceCtrlDispatcher has been called). // // Delayed initialization of the Application object may affect // events which then occur prior to initialization, such as // TService.OnCreate. It is only recommended if the ServiceApplication // registers a class object with OLE and is intended for use with // Windows 2003 Server. // // Application.DelayInitialize := True; // if not Application.DelayInitialize or Application.Installing then Application.Initialize; Application.CreateForm(TSystemLogService, SystemLogService); Application.Run; end.
unit ServerMain; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.SvcMgr, Vcl.Dialogs, Registry, Vcl.Forms; type TSystemLogService = class(TService) procedure ServiceStart(Sender: TService; var Started: Boolean); procedure ServiceStop(Sender: TService; var Stopped: Boolean); procedure ServiceAfterInstall(Sender: TService); private procedure RegistryEventSource; //如果是一般的应用程序,可以使用这个function来写入系统日志 procedure WriteSystemLog(Msg: string; EventType: Cardinal); public function GetServiceController: TServiceController; override; constructor CreateNew(AOwner: TComponent; Dummy: Integer = 0); override; end; var SystemLogService: TSystemLogService; implementation {$R *.DFM} procedure ServiceController(CtrlCode: DWord); stdcall; begin SystemLogService.Controller(CtrlCode); end; constructor TSystemLogService.CreateNew(AOwner: TComponent; Dummy: Integer); begin inherited; inherited CreateNew(AOwner, Dummy); AllowPause := False; Interactive := True; OnStart := ServiceStart; OnStop := ServiceStop; end; function TSystemLogService.GetServiceController: TServiceController; begin Result := ServiceController; end; procedure TSystemLogService.RegistryEventSource; var reg: TRegistry; EventMessageFile: string; TypesSupported: Integer; begin reg := TRegistry.Create; try with reg do begin RootKey := HKEY_LOCAL_MACHINE; try if OpenKey('SYSTEM\CurrentControlSet\Services\EventLog\Application\' + Self.Name, false) then begin Application.MessageBox('Event Source exists', 'hint', MB_OK + MB_ICONERROR); EventMessageFile := ReadString('EventMessageFile'); if LowerCase(EventMessageFile)<>LowerCase(Application.ExeName) then WriteExpandString('EventMessageFile', Application.ExeName); TypesSupported := ReadInteger('TypesSupported'); if TypesSupported<>7 then WriteInteger('TypesSupported', 7); end else begin reg.CreateKey('SYSTEM\CurrentControlSet\Services\EventLog\Application\' + Self.Name); if OpenKey('SYSTEM\CurrentControlSet\Services\EventLog\Application\' + Self.Name, false) then begin WriteExpandString('EventMessageFile', Application.ExeName); reg.WriteInteger('TypesSupported', 7); end; end; except Application.MessageBox('Event Source Register Fail', 'Error', MB_OK + MB_ICONERROR); end; end; finally Reg.CloseKey(); reg.Free; end; end; procedure TSystemLogService.ServiceAfterInstall(Sender: TService); var reg: TRegistry; begin reg := TRegistry.Create; try with reg do begin RootKey := HKEY_LOCAL_MACHINE; if OpenKey('SYSTEM\CurrentControlSet\Services\' + Self.Name, false) then begin WriteString('Description', 'Demo for write log to system log'); end; CloseKey(); end; RegistryEventSource; finally reg.Free; end; end; procedure TSystemLogService.ServiceStart(Sender: TService; var Started: Boolean); begin Started := False; LogMessage('Service Start Success', EVENTLOG_INFORMATION_TYPE, 0, 1000); Started := True; end; procedure TSystemLogService.ServiceStop(Sender: TService; var Stopped: Boolean); begin Stopped := False; LogMessage('Service Stop Success', EVENTLOG_INFORMATION_TYPE, 0, 1000); Stopped := True; end; //如果是一般的应用程序,可以使用这个function来写入系统日志 procedure TSystemLogService.WriteSystemLog(Msg: string; EventType: Cardinal); var hEventSource: THandle; begin hEventSource := RegisterEventSource(nil, PChar(Self.Name)); if hEventSource > 0 then begin case EventType of EVENTLOG_INFORMATION_TYPE: begin //EventID:1000 在SystemLog.mc 定义的 ReportEvent(hEventSource, EVENTLOG_INFORMATION_TYPE, 0, 1000, nil, 2, 0, @Msg, nil); end; EVENTLOG_ERROR_TYPE: begin ReportEvent(hEventSource, EVENTLOG_ERROR_TYPE, 0, 1001, nil, 2, 0, @Msg, nil); end; end; DeregisterEventSource(hEventSource); end; end; end.
下载源代码:SystemLog.rar
相关文章推荐
- Delphi应用程序日志写入系统日志
- IIS中报错弹出调试,系统日志-错误应用程序名称: w3wp.exe,版本: 8.5.9600.16384,时间戳: 0x5215df96(360主机卫士)
- 使用logwrapper工具将可执行程序的输出写入日志系统
- 基于codeigniter框架写的网站日志系统适配器(支持写入本地文件、数据库、远程服务器)
- Android应用程序框架层和系统运行库层日志系统源代码分析
- C#写入错误信息到WINDOWS日志查看器中的应用程序日志
- 用ASP.NET将网页错误信息写入系统日志
- C# 向计算机系统写入windows日志(系统日志)。
- Ubuntu查看和写入系统日志
- Android应用程序框架层和系统运行库层日志系统源代码分析
- Android应用程序框架层和系统运行库层日志系统源代码分析
- 用EventLog类读取和写入系统日志
- Android应用程序框架层和系统运行库层日志系统源代码分析
- 用ASP.NET将网页错误信息写入系统日志
- 用ASP.NET将网页错误信息写入系统日志
- c#扩展SPRING,配置里有不存在的业务系统xml导致不能启动问题,把配置文件里有重复的服务ID找出来并写入到日志
- syslog简介——系统日志写入API
- ELK日志系统之通用应用程序日志接入方案
- syslog简介——系统日志写入API
- 获取系统URL访问的前三名(通过Scala方式实现/通过Spark方式实现),Spark将URL访问日志进行分类并通过自定义Partitioner的方式将文件写入到不同分区上