記事 Hiroshi Sato · 10月 7, 2021 3m read

ジャーナルファイルの内容を管理ポータル以外で参照する方法

これは InterSystems FAQ サイトの記事です。
ジャーナルファイルのサイズが大きすぎて、管理ポータルで検索やフィルタリング等できない場合、以下の2つの方法で参照することができます。

① ^JRNDUMP ユーティリティを使用する方法
② プログラムで参照する方法

============================================================ 

① ^JRNDUMP ユーティリティを使用する方法 例えば、グローバル参照 ^ABC を含むジャーナルファイルのすべてのレコードを選択する場合は、以下のようになります。


※以下、すべてのコマンドは %SYS ネームスペースで実行してください。

DO SELECT^JRNDUMP("C:\MyCache\mgr\journal\YYYYMMDD.001","","","^ABC",1)

 

グローバル参照 ^ABC に完全に一致するレコードのみを選択する場合は、以下のようになります。 

DO SELECT^JRNDUMP("C:\MyCache\mgr\journal\YYYYMMDD.001","","","^ABC",0)

 

グローバル ^ABC に対するローカルの Set 処理のレコードのみを選択する場合は、以下のようになります。 

 DO SELECT^JRNDUMP("C:\MyCache\mgr\journal\YYYYMMDD.001","","","^ABC","",6)

 

グローバル ^ABC に対するローカルおよびリモートの Set 処理のレコードのみを選択する場合は、以下のようになります。 

DO SELECT^JRNDUMP("C:\MyCache\mgr\journal\YYYYMMDD.001","","","^ABC","","s")

 

詳細は下記ドキュメントページをご覧ください。


^JRNDUMP を使用したジャーナル・レコードの表示


============================================================ 
② プログラムで参照する方法 %SYS.Journal.Record クラスを使用して、任意のジャーナルファイルのレコード内容を取得することができます。

set jrn="C:\intersystems\cache\mgr\journal\20160101.003"set log="C:\temp\journal.log"set file=##class(%File).%New(log)
  do file.Open("WSN")
  set rs=##class(%ResultSet).%New("%SYS.Journal.Record:List")
  do rs.Execute(jrn)
  while rs.Next() {
  set time=rs.Get("TimeStamp") // 時間:yyyy-mm-dd hh:mm:ssset type=rs.Get("TypeName"// タイプ:SET、KILL、xxTrans などset gref=rs.Get("GlobalReference") // グローバル参照set gval=rs.Get("NewValue"// 更新後の値/* if gref["ABC" { */set line=time_" ["_type_"] "_gref
  if type="SET" { set line=line_"="_gval }
  do file.WriteLine(line)
  /* } */
  }
  do file.Close() 

 

※このサンプルコードは、表示対象のデータが一般的なテキストデータのみで構成されていることを前提に記述されています。

※データにコントロールコード等非表示のデータが含まれる場合にはファイルに正確に出力されない場合があります。

詳細は下記クラスリファレンスをご覧ください。


クラスリファレンス(%SYS.Journal.Record:List)

Comments

Seisuke Nakahashi · 7月 22, 2024

上記(2)は、あくまでテキストベースで参照するための簡単なサンプルになります。
そのため、グローバルの値が gval=$LB("abc","xyz")gval="abc"_$C(1)_"xyz" など制御コードが含まるときは、ファイルにはそのまま出力されませんので、その点ご注意くださいませ。

「そのようなデータも見たいな」と言われる方は、コメントなどでお寄せください。

0
松川 幸久  11月 6, 2024 to Seisuke Nakahashi

おじゃまします。まさに次のような$LBの制御コードにあたってしまいました。宜しければご教授お願いできますでしょうか?

0
Seisuke Nakahashi  11月 6, 2024 to 松川 幸久

@松川 幸久 さん、
$LIST形式のデータであれば、$LISTTOSTRING(list) というコマンドで文字列にできます。
ということで、こんなのはどうでしょうか?

set line=time_" ["_type_"] "_gref
   if type="SET" {
      if$LISTVALID(gval) {   // if gval is $LIST dataset gval="$LB("_$LISTTOSTRING(gval)_")"
      }
      set line=line_"="_gval
   }

わかりやすく $LB( ) で前後をくくってみました。 以下のように出力されます。
11/07/2024 02:50:12 [SET] ^["^^c:\intersystems\iris\mgr\user\"]naka=$LB(a,1,xyz)
11/07/2024 10:51:29 [SET] ^["^^c:\intersystems\iris\mgr\user\"]naka(2)=123

 

0
松川 幸久  11月 6, 2024 to Seisuke Nakahashi

早速のご助言ありがとうございます。$LISTTOSTRINGでサクッと表示できました。普段リスト系をあまり利用していないもので、お恥ずかしい限りです。大変参考になりました。ありがとうございました。

0