Delphi应用程序日志写入系统日志
2013-04-14 00:31
225 查看
原文地址
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工程
具体代码如下:
[delphi] view
plaincopy
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.
[delphi] view
plaincopy
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.
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工程
具体代码如下:
[delphi] view
plaincopy
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.
[delphi] view
plaincopy
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.
相关文章推荐
- Delphi应用程序日志写入系统日志
- Android应用程序框架层和系统运行库层日志系统源代码分析
- Android应用程序框架层和系统运行库层日志系统源代码分析
- 4安德鲁斯.2.2在系统,具有系统权限的应用程序无法读取或写入SD卡
- 用java端,通过log4j 把日志写入scribe 日志系统
- Android应用程序框架层和系统运行库层日志系统源代码分析
- c++写入应用程序日志(Event Log )
- syslog简介——系统日志写入API
- c++写入应用程序日志(Event Log )
- Delphi应用程序的调试(八)事件日志窗口和模块窗口
- asp.net中如何把应用程序错误写入事件日志(注册事件源)
- 用ASP.NET将网页错误信息写入系统日志----简单
- syslog简介——系统日志写入API
- windows xp 创建 Oracle(11G)数据库实例时写入系统日志失败解决方案
- Android应用程序框架层和系统运行库层日志系统源代码分析
- 获取系统URL访问的前三名(通过Scala方式实现/通过Spark方式实现),Spark将URL访问日志进行分类并通过自定义Partitioner的方式将文件写入到不同分区上
- C#创建创建文本文件写入读取,可以用来做系统日志或程序操作日志或者错误记录
- asp.net中使用Global.asax文件中添加应用出错代码,写入系统日志文件或数据库
- Android源码解析之应用程序框架层和系统运行库层日志系统
- syslog简介——系统日志写入API