Delphi RAD Server按日期将控制台日志写入文件的实现方法
RAD Server 按日期分割日志文件的实现方案
方案一:自定义日志处理器(代码层面实现,灵活可控)
RAD Server基于EMS框架,默认日志处理器是TEMSLogHandler,我们可以通过继承并重写其日志写入逻辑,实现按日期生成独立日志文件。
- 创建自定义日志处理单元
新建一个Delphi单元,编写如下代码:
unit CustomEMSLogHandler; interface uses System.Classes, EMS.Services, System.SysUtils; type TCustomEMSLogHandler = class(TEMSLogHandler) protected procedure InternalLog(const AMessage: string; const ALogType: TEMSLogType); override; private function GetDailyLogFileName: string; end; implementation procedure TCustomEMSLogHandler.InternalLog(const AMessage: string; const ALogType: TEMSLogType); var LLogFile: TStreamWriter; LFileName: string; begin LFileName := GetDailyLogFileName; // 确保日志目标目录存在 ForceDirectories(ExtractFilePath(LFileName)); // 以追加模式写入日志,保留UTF-8编码 LLogFile := TStreamWriter.Create(LFileName, True, TEncoding.UTF8); try LLogFile.WriteLine(FormatDateTime('yyyy-mm-dd hh:nn:ss', Now) + ' [' + TEMSLogTypeToString(ALogType) + '] ' + AMessage); finally LLogFile.Free; end; end; function TCustomEMSLogHandler.GetDailyLogFileName: string; begin // 自定义日志路径和文件名格式,示例为程序目录下Logs文件夹,文件名带日期(如EMS_20240520.log) Result := IncludeTrailingPathDelimiter(ExtractFilePath(ParamStr(0)) + 'Logs') + 'EMS_' + FormatDateTime('yyyyMMdd', Now) + '.log'; end; end.
- 替换默认日志处理器
在ServerContainer的OnCreate事件中,替换默认的日志处理器:
procedure TServerContainer.ServerContainerCreate(Sender: TObject); begin // 释放默认日志处理器 EMSLogHandler.Free; // 实例化自定义日志处理器 EMSLogHandler := TCustomEMSLogHandler.Create; end;
编译部署后,RAD Server会自动按日期生成独立日志文件,无需修改emsserver.ini的日志配置。
方案二:利用系统工具实现日志轮转(运维层面,无需改代码)
如果不想修改项目代码,可以借助操作系统自带工具,定期切割并重命名日志文件,实现按日期归档。
Linux 环境(使用logrotate)
- 创建logrotate配置文件,比如
/etc/logrotate.d/radserver,内容如下:
/path/to/your/radserver/logs/emsserver.log { daily # 每天轮转一次 rotate 30 # 保留30天的日志 compress # 压缩旧日志 missingok # 日志文件不存在时不报错 notifempty # 空日志不轮转 create 640 radserver radserver # 新建日志文件的权限和属主 postrotate # 重启RAD Server服务使其重新写入新日志文件(根据你的服务名调整) systemctl restart radserver.service endscript }
替换/path/to/your/radserver/logs/emsserver.log为实际的日志文件路径。
- logrotate会自动按配置执行轮转,无需额外操作。
Windows 环境(任务计划+批处理脚本)
- 编写批处理脚本
RotateRADLogs.bat:
@echo off set LOG_ROOT=C:\RADServer\Logs set LOG_FILE=%LOG_ROOT%\emsserver.log :: 日志文件不存在则退出 if not exist "%LOG_FILE%" exit /b :: 生成日期字符串(格式:YYYYMMDD) set DATE_STR=%date:~0,4%%date:~5,2%%date:~8,2% :: 重命名当日日志文件 ren "%LOG_FILE%" "emsserver_%DATE_STR%.log" :: 重启RAD Server服务(替换为你的实际服务名) net stop "RAD Server Service" net start "RAD Server Service"
- 创建Windows任务计划:
- 触发器设置为每天凌晨0点执行
- 操作选择启动程序,指向上述批处理脚本
- 确保任务执行账号有足够权限重启RAD Server服务
内容的提问来源于stack exchange,提问作者Leong
相关产品推荐
相关产品推荐

