{*******************************************************} { } { xPrintLogService } { } { Copyright (C) 2025 kku } { } {*******************************************************} unit xPrintLogService; interface uses System.SysUtils, System.Classes, Tocsg.Files; type TxPrintLogService = class(TTgDirWatchBase) private sLogDir_: String; bIsWorking_: Boolean; procedure ProcessDirWatchEnt(Sender: TObject; pInfo: PDirWatchEnt); override; public Constructor Create; Destructor Destroy; override; procedure StartService; procedure StopService; property IsWorking: Boolean read bIsWorking_; end; implementation uses Tocsg.Exception, Tocsg.Path, superobject, ManagerService, GlobalDefine, Tocsg.Safe, Tocsg.Strings; Constructor TxPrintLogService.Create; begin Inherited Create(true, false); bIsWorking_ := false; sLogDir_ := 'C:\ProgramData\bsoneprint\logs\'; end; Destructor TxPrintLogService.Destroy; begin StopService; Inherited; end; procedure Send_xPrintLog(aO: ISuperObject); function GetStrRange(sVal: String; nLen: Integer): String; begin if Length(sVal) > nLen then SetLength(sVal, nLen); Result := sVal; end; var sMsg: String; dt: TDateTime; O: ISuperObject; StrList: TStringList; begin try sMsg := Format('Billcode : %s, Document : %s', [aO.S['bizworkCode'], aO.S['docname']]); dt := Now; O := SO; O.S['TYP_MSG'] := '@(!)_IC_P'; O.S['KEY_AGENTID'] := gMgSvc.AgentId; O.S['KEY_EMPNO'] := gMgSvc.EmpNo; O.S['KEY_HOSTNAME'] := gMgSvc.UserName; O.S['KEY_SUBMITTIME'] := FormatDateTime('yyyy-mm-dd hh:nn:ss', dt); O.S['key_submitTime'] := O.S['logtime']; O.S['KEY_LOGCODE'] := LOGCODE_EVENT_PRINTER; O.S['DETECTION_DATE'] := O.S['KEY_SUBMITTIME']; // 이벤트 발생 시각. REQUEST의 경우, 예외 신청할 이벤트의 발생 시각 O.S['detectionDate'] := O.S['key_submitTime']; // 이벤트 발생 시각. REQUEST의 경우, 예외 신청할 이벤트의 발생 시각 O.S['KEY_SUMMARY'] := sMsg; O.S['PRINTER_JOBNAME'] := aO.S['docname']; O.S['actionGroupId'] := aO.S['uidkey']; // 문서번호 O.I['printCopyCnt'] := aO.I['copycnt']; // 부수 O.I['printPageCnt'] := aO.I['sheetcnt']; // 장수 // 스마트웨어 연동 정보 매치 O.S['userId'] := GetStrRange(aO.S['userid'], 30); O.S['guidKey'] := GetStrRange(aO.S['uidkey'], 40); O.S['macCode'] := GetStrRange(aO.S['maccode'], 30); O.S['modelCode'] := GetStrRange(aO.S['modelname'], 50); O.S['macLocation'] := GetStrRange(aO.S['maclocation'], 100); O.S['userComIP'] := GetStrRange(aO.S['usercomip'], 15); O.S['docName'] := GetStrRange(aO.S['docname'], 255); O.S['unitPaperSize'] := GetStrRange(aO.S['pagersize'], 30); O.S['unitColorMode'] := GetStrRange(aO.S['colormode'], 1); O.S['unitDuplexMode'] := GetStrRange(IntToStr(aO.I['duplexmode']), 1); O.I['sT_PageCnt'] := aO.I['sheetcnt']; O.I['sT_CopyCnt'] := aO.I['copycnt']; O.S['jobType'] := '0'; // 출력구분 (0 : Print), Len=3 Guard(StrList, TStringList.Create); SplitString(aO.S['pagersize'], 'X', StrList); if StrList.Count > 1 then begin O.S['unitPaperSizeW'] := GetStrRange(StrList[0], 10); O.S['unitPaperSizeH'] := GetStrRange(StrList[1], 10); end else begin O.S['unitPaperSizeW'] := ''; O.S['unitPaperSizeH'] := ''; end; O.S['xerox_YN'] := GetStrRange(aO.S['xeroxyn'], 1); O.S['macIP'] := GetStrRange(aO.S['macip'], 15); // GetStrRange(aO.S['usercommacaddr'], 15); O.S['usercommacaddr'] := GetStrRange(aO.S['usercommacaddr'], 15); O.S['macFloor'] := GetStrRange(aO.S['mac_floor'], 10); O.S['macPartName'] := GetStrRange(aO.S['mac_partname'], 30); O.S['bizWorkCode'] := GetStrRange(aO.S['bizworkCode'], 100); O.S['billable'] := GetStrRange(IntToStr(aO.I['billable']), 1); O.S['err_BizWorkCodeYN'] := GetStrRange(aO.S['err_bizworkcodeyn'], 1); O.S['collectMode'] := '0'; // 집계방식 (김앤장 사양 대응 -> 0:실시간 집계, 1: 접속후 집계, 2:Upload 집계), Len=1 O.S['winID'] := GetStrRange(aO.S['usercomloginname'], 30); O.S['jobSTDate'] := GetStrRange(StrsReplace(aO.S['jobstdate'], ['-', ':', 'T', 'Z'], ''), 14); // 정보 추가 25_0911 20:44:36 kku O.S['processName'] := GetStrRange(aO.S['processname'], 30); O.S['deviceName'] := GetStrRange(aO.S['devicename'], 30); O.S['printName'] := GetStrRange(aO.S['printname'], 30); gMgSvc.EventLog.Push(O.AsJSon); except on E: Exception do ETgException.TraceException(E, 'Fail .. SendEventLog()'); end; end; procedure TxPrintLogService.StartService; var StrList: TStringList; i: Integer; O: ISuperObject; begin if not DirectoryExists(sLogDir_) then exit; Guard(StrList, TStringList.Create); ExtrFilesFromDir(sLogDir_, StrList, false, 'json'); for i := 0 to StrList.Count - 1 do begin if LoadJsonObjFromFile(O, sLogDir_ + StrList[i]) then begin Send_xPrintLog(O); DeleteFile(sLogDir_ + StrList[i]); end; end; if not bIsWorking_ then begin AddDirWatch(sLogDir_); bIsWorking_ := true; Processor_.StartThread; end; end; procedure TxPrintLogService.StopService; begin if bIsWorking_ then begin bIsWorking_ := false; Processor_.Clear; Processor_.PauseThread; try ClearDirWatch; except on E: Exception do ETgException.TraceException(Self, E, 'Fail .. StopService()'); end; end; end; procedure TxPrintLogService.ProcessDirWatchEnt(Sender: TObject; pInfo: PDirWatchEnt); var O: ISuperObject; begin try if pInfo.dwAction = 3 then // Modify begin if GetFileExt(pInfo.sPath).ToUpper <> 'JSON' then exit; if LoadJsonObjFromFile(O, pInfo.sPath) then begin Send_xPrintLog(O); DeleteFile(pInfo.sPath); end; end; except on E: Exception do ETgException.TraceException(Self, E, 'Fail .. ProcessDirWatchEnt()'); end; end; end.