[Salesforce]EventLogFileをファイルに保存するPGM

日次で実行されるようにスケジュールしたApexバッチでEventLogFileを取得し、Salesforce上のファイルに保存するPGM。
お作法がなってないかもしれませんが大目に見て欲しいです。
誰かの参考になれば幸いです。
# PGM（Apexクラス）
```ruby:DownloadEventLogFileBatch
public class DownloadEventLogFileBatch implements Database.Batchable<sObject>, Database.Stateful{
    // *************************************************
    // EventLogFileをダウンロードしてファイルに格納する。
    //
    // Date targetLogDate = Date.newInstance(2022,2,24);
    // DownloadEventLogFileBatch bat = new DownloadEventLogFileBatch(targetLogDate);
    // Id jobId = Database.executeBatch(bat);
    //
    // *************************************************

    private Date targetLogDate;

    /**
     * コンストラクタ
     * @param なし
     * @return void
     */
    public downloadEventLogFileBatch() {
    }

    /**
     * コンストラクタ
     * @param targetLogDate Date 取得したいログの日付(GMTで)
     * @return void
     */
    public downloadEventLogFileBatch(Date targetLogDate) {
        this.targetLogDate = targetLogDate;
    }

    /**
     * start処理
     * @param BC Database.BatchableContext
     * @return Database.QueryLocator
     */
    public Database.QueryLocator start(Database.BatchableContext BC){
        // クエリ生成
        Time t = Time.newInstance(0,0,0,0);
        Datetime dt;
        if(targetLogDate == null){
            dt = DateTime.newInstanceGMT(DateTime.now().dateGMT(),t).addDays(-2);
        } else {
            dt = DateTime.newInstanceGMT(targetLogDate,t);
        }
        System.debug('dt:'+dt);
        String query = 'SELECT id,EventType,LogDate,LogFile FROM EventLogFile WHERE LogDate = ' + dt.format('yyyy-MM-dd\'T\'00:00:00.000\'+0000\'');
        System.debug('query:'+query);
        return Database.getQueryLocator(query);
    }

    /**
     * execute処理
     * @param BC Database.BatchableContext
     * @param scope List<sObject>
     * @return void
     */
    public void execute(Database.BatchableContext BC, List<sObject> scope){
        try{
            List<ContentVersion> cvList = new List<ContentVersion>();
            for(EventLogFile elf : (List<EventLogFile>) scope){
                ContentVersion cv = new ContentVersion();
                cv.ContentLocation = 'S'; // ファイルはSalesforce上に保存
                cv.PathOnClient = String.valueof(elf.LogDate.dateGMT())+'_'+elf.EventType+'.csv'; // ファイル名
                cv.Title = String.valueof(elf.LogDate.dateGMT())+'_'+elf.EventType+'.csv'; // ファイルタイトル
                cv.VersionData = elf.LogFile; // ファイルデータ
                cvList.add(cv);
            }
            if(cvList.size() > 0){
                insert cvList;
            }
        } catch(Exception e) {
            System.debug('Exception:'+e.getMessage());
        }
    }

    /**
     * finish処理
     * @param BC Database.BatchableContext
     * @return void
     */
    public void finish(Database.BatchableContext BC){    
    }
}
```
```ruby:DownloadEventLogFileBatchSchedule
global class DownloadEventLogFileBatchSchedule implements Schedulable {
    
    public downloadEventLogFileBatchSchedule() {
    }

    /**
    * バッチ処理の起動
    * @param SC SchedulableContext
    * @return void 
    */
    global void execute(SchedulableContext SC){
        Id batchInstanceId = Database.executeBatch(new DownloadEventLogFileBatch());
    }
}
```
# スケジュール済みジョブの定義
<img width="600" alt="スケジュール例" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/932886/bb843cd9-780a-3100-a451-401fa108e05d.png">