JobSchedulerのログローテーション設定

JobSchedulerはジョブの実行履歴やJobScheduler Engineの動作ログ等様々な情報をログ分けて出力します。
このログですが、標準のインストール・設定だけだとかなり肥大化するので注意が必要です。

特に、Engineに関する全ログを集約して出力するscheduler.log(デフォルトの設定の場合は/var/log/sos-berlin.com/jobscheduler/scheduler/scheduler.log)が非常に大きくなります。

そのため、長期的に稼働させる場合にはローテーション設定が重要です。

その方法としては2パターン考えられます。

* JobSchedulerに標準実装されているJobSchedulerRotateLogを活用
* 通常のOS側のlogrotateを活用

# JobSchedulerに標準実装されているJobSchedulerRotateLogを活用

JobSchedulerはジョブ管理ツールなので、ログのローテーションジョブも実施できるよう実装が入っています。
Engineをインストールするとliveフォルダに標準で配置されるsos/housekeepingというディレクトリ内にそのジョブは入っています。

この中身は非常にシンプルに記載されています。

```xml:scheduler_rotate_log.job.xml
<job title="Rotate and compress logfiles">
  <description>
    <include file="jobs/JobSchedulerRotateLog.xml"/>
  </description>
  <params/>
  <script java_class="sos.scheduler.job.JobSchedulerRotateLog" language="java"/>
</job>
```

sos.scheduler.job.JobSchedulerRotateLog
このJavaのクラスを実行するというのみです。

この中身はログファイルのパスとその保存期間日数を指定して実行することでローテーション管理するというものです。

http://www.sos-berlin.com/doc/doxygen-docs/scheduler/html/_job_scheduler_rotate_log_8java_source.html

## 指定できるパラメータ

* file_path: ローテーション対象のログファイルのパス指定(デフォルト: ./logs)
* file_specification: ローテーション処理対象のログファイル名の指定(デフォルト: ^(scheduler).*([0-9\\-]+).*(\.log)$)
* delete_file_specification: 削除対象のログファイル名の指定(デフォルト: ^(scheduler)([0-9\\-]+).*(\.log)(\.gz)?$)
* file_age: ローテーションファイルの保持数・期間(デフォルト:14d(14日)、最終更新時刻がジョブ実行時点から14日以前のものが対象となる設定)
    * 1d(1日),1w(1週間),1m(1ヶ月)等の指定が可能
* delete_file_age: 削除ファイルの保持期間(デフォルト:0 = 自動削除しない)
    * gzファイルの最終更新時刻がいつ以前のものを完全に削除するかを指定します。指定方法はfile_ageと同様。


## 挙動

1. 削除対象ファイルの削除処理を実施
2. ローテート処理を実施
3. scheduler.logをscheduler-old.logにmvしてscheduler.logを新規作成

## 使い方

JobScheduler Engineをインストールしただけでは上記のRotateLogのジョブは単にジョブが登録されるだけで実行計画がなしの状態になっています。
そのため、scheduler.logは増え続ける一方となっています。

そこで、上記のJobSchedulerRotateLogを1日に1回実行するよう設定をしておくと良いでしょう。

JobSchedulerは各単発のジョブ(Standalone Job)に対してももちろんスケジュール設定が可能です。
sos/housekeeping/scheduler_rotate_log.xmlの中身を変更して実行スケジュール定義を追記します。

## 例: 毎日1:00にローテート処理をし、1週間分ログを保存。さらに1週間分はgz圧縮したものを保存しそれ以上のファイルは削除。

```xml:scheduler_rotate_log.job.xml
<?xml version="1.0" encoding="iso-8859-1"?>

<job title = "Rotate and compress logfiles">

    <description>
      <include file = "jobs/JobSchedulerRotateLog.xml"/>
    </description>
    
    <params>
      <param name = "file_age" value = "1w"/>
      <param name = "delete_file_age" value = "2w"/>
    </params>
    
    
    <script language      = "java"
            java_class    = "sos.scheduler.job.JobSchedulerRotateLog"/>
    
    <!-- rotate log files at the in the given start time -->
    <run_time let_run = "yes"
              begin   = "00:00" 
              end     = "24:00">
       <period single_start = "01:00"/>
     </run_time>
</job>
```

## 注意点その1

このローテートジョブはJobScheduler Engineを起動するときに自動で走るようになっています。
そのため、たまに再起動等しているとそのタイミングにてローテートされています。
Engineの起動による実行と、定期的なジョブ実行の混在でファイル管理に混乱をきたさないよう注意が必要です。

## 注意点その2

削除対象のファイルについて、デフォルトの設定の場合、日次で1回scheduler_rotate_log.job.xmlを実行したとしても、14日を超えたログがgz圧縮されるだけでファイル自体削除はされません。
delete_file_ageを設定しないと結局ディスク消費は止まらないので必ず設定するようにして下さい。
※また、このdelete_file_ageの設定を2や10といった数字だけで指定してしまうと何故か全gzファイルが削除されてしまったのでご注意を。あくまで1d,1w,1mといった期間指定で削除設定する必要があります。

# 通常のOS側のlogrotateを活用

JobScheduler EngineをLinux OSにインストールするのであればデフォルトで入っているlogrotateを活用するのも手っ取り早いです。

例えば、以下のような感じで設定すればOKです。

```shell-session:/etc/logrotate.d/jobscheduler
/home/scheduler/sos-berlin.com/jobscheduler/scheduler/logs/scheduler.log {
    copytruncate
    missingok
    notifempty
    compress
    rotate 14
    daily
    create 0664 scheduler scheduler
}
```


# 最後に..ローテート対象とすべきログについて

上記はscheduler.logを中心に解説しました。
JobSchedulerが出力するログの対象としては実はこれだけではなくlogsフォルダを見ると非常に多くのログファイルが出力されています。
ジョブ毎、タスク毎、オーダー毎といった感じでログが出力されます。
出力されるログの内容についてはこちらを参照して下さい。

http://www.sos-berlin.com/doc/en/scheduler/data/scheduler.protokolle.htm

ジョブのログ(job.・・・.log)やオーダーのログ(order.・・・.log)も実行頻度によっては少しずつ肥大化するのでローテーションの対象とするのが良いと思います。
タスクのログ(task.・・・.log)にについては1回タスクが実行される毎に内容が上書きされる(タスクの実行結果自体はDBに格納)のでローテート設定なしでも良いかと思います。