You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Delphi RAD Server按日期将控制台日志写入文件的实现方法

RAD Server 按日期分割日志文件的实现方案

方案一:自定义日志处理器(代码层面实现,灵活可控)

RAD Server基于EMS框架,默认日志处理器是TEMSLogHandler,我们可以通过继承并重写其日志写入逻辑,实现按日期生成独立日志文件。

  1. 创建自定义日志处理单元
    新建一个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.
  1. 替换默认日志处理器
    在ServerContainer的OnCreate事件中,替换默认的日志处理器:
procedure TServerContainer.ServerContainerCreate(Sender: TObject);
begin
  // 释放默认日志处理器
  EMSLogHandler.Free;
  // 实例化自定义日志处理器
  EMSLogHandler := TCustomEMSLogHandler.Create;
end;

编译部署后,RAD Server会自动按日期生成独立日志文件,无需修改emsserver.ini的日志配置。

方案二:利用系统工具实现日志轮转(运维层面,无需改代码)

如果不想修改项目代码,可以借助操作系统自带工具,定期切割并重命名日志文件,实现按日期归档。

Linux 环境(使用logrotate)

  1. 创建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为实际的日志文件路径。

  1. logrotate会自动按配置执行轮转,无需额外操作。

Windows 环境(任务计划+批处理脚本)

  1. 编写批处理脚本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"
  1. 创建Windows任务计划:
  • 触发器设置为每天凌晨0点执行
  • 操作选择启动程序,指向上述批处理脚本
  • 确保任务执行账号有足够权限重启RAD Server服务

内容的提问来源于stack exchange,提问作者Leong

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 12:05:24