游戏数据实时监控和分析

  概述

为了更好的了解到游戏运行时的状态,对相关的功能和数据进行分析是很重要的,设计了本系统。

现有的游戏数据大部分采用的是文本输出,备份,然后离线数据分析的方式,不能实时的监控的游戏的状态.

相关技术:

1:产生日志服务器采用c++ 实现

2:日志监控服务器采用Java 实现

3: 采用hadloop分布式架构.为应付大规模数据和实时的要求,尽快对数据进行分析

4: 存储日志采用mongodb分布式部署,mongodb的日志插入性能有保证.

架构图:

实现的难点:

1:日志直接入mongodb数据库,安全性和性能直接的权衡,以及那些日志入库和是不是要采用缓冲

2:不同用户的需求,日志分析服务器map,reduce实现的通用和性能权衡。对于固定的需求,采用每天定时输出就可以了,转化为图表的格式。

 但对于实时的需求,可能没法采用固定的map,reduce算法了,可以考虑采用hadoop的streaming,用python来实现

实现先从日志入mongodb开始吧

unit Unit3; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, xpWindow, StdCtrls, AAFont, AACtrls; type TForm3 = class(TForm) Label2: TLabel; xpWindow1: TxpWindow; AAFadeText1: TAAFadeText; private { Private declarations } public { Public declarations } end; var Form3: TForm3; implementation {$R *.dfm} end. unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, shellapi, Menus, StdCtrls, ExtCtrls, AAFont, AACtrls, AAFontDialog,Registry, xpWindow; const wm_traynotify=wm_user+1000; type TForm1 = class(TForm) PopupMenu1: TPopupMenu; NToDos: TMenuItem; NCancel: TMenuItem; NReboot: TMenuItem; NClose: TMenuItem; Memo1: TMemo; N1: TMenuItem; GroupBox1: TGroupBox; Timer1: TTimer; CheckBox1: TCheckBox; CheckBox2: TCheckBox; CheckBox3: TCheckBox; AAFontDialog1: TAAFontDialog; xpWindow1: TxpWindow; AAScrollText1: TAAScrollText; Label1: TLabel; procedure FormCreate(Sender: TObject); procedure formdestroy(sender:tobject); procedure btnCancelClick(Sender: TObject); procedure btnToDosClick(Sender: TObject); procedure btnRebootClick(Sender: TObject); procedure btnCloseClick(Sender: TObject); procedure CheckBox1Click(Sender: TObject); procedure CheckBox2Click(Sender: TObject); procedure CheckBox3Click(Sender: TObject); procedure Timer1Timer(Sender: TObject); procedure N1Click(Sender: TObject); private { Private declarations } my_tray_icon:tnotifyicondata; procedure wmmytrayiconcallback(var msg:tmessage); message wm_traynotify; public { Public declarations } // procedure GameGontrol(sender:TObject); end; var Form1: TForm1; game:array[0..255] of string; FilePath : string; implementation uses Unit2, Unit3; {$R *.DFM} // 自定义过程,用于程序运行后,屏蔽操作系统的任务管理器 procedure DisableTaskmgr(Key: Boolean); Var Reg:TRegistry; Begin Reg:=TRegistry.Create; try Reg.RootKey := HKEY_CURRENT_USER; if Reg.OpenKey('\Software\Microsoft\Windows\CurrentVersion\Policies\System', True) then begin if Key then Reg.WriteString('DisableTaskMgr','1') else Reg.WriteInteger('DisableTaskMgr',0); Reg.CloseKey; end; except Reg.Free; end; end; procedure TForm1.FormCreate(Sender: TObject); var key:boolean; hKey:string; hReg:TregIniFile; registerTemp:TRegistry; begin // 程序开机自动运行 try registerTemp:=TRegistry.create; registerTemp.RootKey:=HKEY_LOCAL_MACHINE; if registerTemp.OpenKey('software\Microsoft\Windows\currentversion\run',True) then begin registerTemp.WriteString(extractfilename(application.ExeName),application.ExeName); end; except Showmessage('该程序无法自动运行,请及时与作者联系!'); end; disableTaskmgr(true); // 程序运行后,屏蔽系统任务管理器,防止学生强制关闭软件 visible:=false; application.ShowMainForm:=visible; with my_tray_icon do begin cbsize:=sizeof(tnotifyicondata); wnd:=handle; uid:=1; uflags:=nif_message or nif_icon or nif_tip; ucallbackmessage:=wm_traynotify; hicon:=loadicon(0,idi_winlogo); sztip:=''; end; shell_notifyicon(nim_add,@my_tray_icon); end; procedure tform1.formdestroy(sender:tobject); begin shell_notifyicon(nim_delete,@my_tray_icon); end; procedure tform1.wmmytrayiconcallback(var msg:tmessage); var cursorpos:tpoint; begin case msg.LParam of wm_lbuttondown: begin visible:=not visible; application.ShowMainForm:=visible; setforegroundwindow(application.handle); end; wm_rbuttondown: begin getcursorpos(cursorpos); popupmenu1.Popup(cursorpos.x,cursorpos.y); end; end; end; procedure TForm1.btnCancelClick(Sender: TObject); begin exitwindowsex(ewx_force,0); end; procedure TForm1.btnToDosClick(Sender: TObject); begin exitwindowsex(ewx_logoff,0); end; procedure TForm1.btnRebootClick(Sender: TObject); var st : SYSTEMTIME; hToken : THANDLE; tkp : TOKEN_PRIVILEGES; rr : Dword; begin OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,hToken); LookupPrivilegeValue(nil,'SeShutdownPrivilege',tkp.Privileges[0].Luid); // 设定权限为1 tkp.PrivilegeCount := 1; tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED; // 得到权限 AdjustTokenPrivileges(hToken, FALSE, tkp, 0,nil,rr); // 重起计算机 ExitWindowsEx(EWX_REBOOT , 0) end; procedure TForm1.btnCloseClick(Sender: TObject); begin // exitwindowsex(ewx_shutdown,0); Formclose.Show; end; procedure TForm1.CheckBox1Click(Sender: TObject); begin if checkbox1.Checked=true then begin checkbox2.Checked:=false; checkbox3.Checked:=false; end ; end; procedure TForm1.CheckBox2Click(Sender: TObject); begin if checkbox2.Checked=true then begin checkbox1.Checked:=false; checkbox3.Checked:=false; end; end; procedure TForm1.CheckBox3Click(Sender: TObject); begin if checkbox3.Checked=true then begin checkbox2.Checked:=false; checkbox1.Checked:=false; end; end; procedure TForm1.Timer1Timer(Sender: TObject); var hcurrentWindow:HWnd; szText:array[0..254] of char; Gamefile:TextFile; // 文本文件,存放已经知道的游戏句柄 s:string; // i,j:integer; st:SYSTEMTIME; hToken:THANDLE; tkp:TOKEN_PRIVILEGES; RR:Dword; begin try if form3.Showing=true then begin form3.Close; end; memo1.Clear; hCurrentWindow:=GetWindow(Handle,GW_HWNDFIRST); While hCurrentWindow<>0 do begin if GetWindowText(hCurrentWindow,@szText,255)>0 then Memo1.Lines.Add(strpas(@sztext)+Datetimetostr(now)); // for i:=0 to 254 do // begin try FilePath := ExtractFilePath(Application.ExeName); // 程序运行后,自动获取Game.txt的路径 assignfile(Gamefile,FilePath+'\game.txt'); // 准备读取game.txt中的信息 reset(Gamefile); except showmessage('^_^'); end; while not eof(Gamefile) do begin readln(Gamefile,s); if strPas(@szText)=s then begin form3.Show; // 发现游戏后,分别处理 if checkbox1.Checked=true then begin sendMessage(hCurrentWindow,WM_CLOSE,0,0); // 关闭游戏 end; if checkbox3.Checked=true then // 关闭计算机 begin openProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES OR TOKEN_QUERY,hToken); LookupPrivilegeValue(nil,'SeShutdownPrivilege',tkp.Privileges[0].Luid); tkp.privilegecount:=1; tkp.privileges[0].Attributes:=se_privilege_enabled; adjusttokenprivileges(hToken,false,tkp,0,nil,rr); exitwindowsex(ewx_poweroff,0); end; if checkbox2.Checked=true then begin exitwindowsex(ewx_force,0); // 注销计算机 end; end; end; // end; hcurrentwindow:=getwindow( hCurrentWindow,gw_hwndnext); end; finally end; end; procedure TForm1.N1Click(Sender: TObject); var p:pchar; //指针,指向将被打开的帮助文件 begin p:=pchar(ExtractFilePath(Application.ExeName)+'Help.chm'); shellexecute(0,nil,p,nil,nil,SW_NORMAL); end; end. unit Unit2; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls,registry,xpWindow; type TFormclose = class(TForm) GroupBox1: TGroupBox; Label1: TLabel; Edit1: TEdit; Button1: TButton; xpWindow1: TxpWindow; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Formclose: TFormclose; implementation uses Unit1; {$R *.dfm} // 自定义过程,用于程序运行后,屏蔽操作系统的任务管理器 procedure DisableTaskmgr(Key: Boolean); Var Reg:TRegistry; Begin Reg:=TRegistry.Create; try Reg.RootKey := HKEY_CURRENT_USER; if Reg.OpenKey('\Software\Microsoft\Windows\CurrentVersion\Policies\System', True) then begin if Key then Reg.WriteString('DisableTaskMgr','1') else Reg.WriteInteger('DisableTaskMgr',0); Reg.CloseKey; end; except Reg.Free; end; end; // 自定义过程,实现系统开机自动运行 procedure SetAuttorun(aProgTitle,aCmdLine:string;aRunOnce:boolean); var hKey:string; hReg:TRegIniFile; begin if aRunOnce then hKey:='Once' else hKey:=''; hReg:=TRegIniFile.Create(''); hReg.RootKey:=HKEY_LOCAL_MACHINE; hReg.WriteString('software\microsoft\windows\currentversion\run' +hKey+#0,aProgTitle,aCmdLine); // 修改操作系统注册表 hReg.Destroy; end; procedure TFormclose.Button1Click(Sender: TObject); var key:boolean; begin if edit1.Text='162534' then begin key:=false; DisableTaskmgr(key); // 当系统推出时恢复任务管理器 application.Terminate; end else begin showmessage('密码错误!'); formclose.Close; end; edit1.Clear; end; end.
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值