文章
TZ Zhuang · 八月 6 阅读大约需 2 分钟

FAQ 常见问题系列--系统管理篇 如何使用命令在Journal日志文件中搜索指定的Global

可以使用%SYS.Journal.File类中的ByTimeReverseOrder查询,以及%SYS.Journal.Record类中的List查询来实现。

下面是这两个查询的具体作用:

A) %SYS.Journal.File类中的ByTimeReverseOrder查询
这个查询会获取journal日志文件名并按降序排列

USER>set rs=##class(%ResultSet).%New("%SYS.Journal.File:ByTimeReverseOrder")
 
USER>do rs.Execute()
 
USER>while rs.Next() { write rs.Name,! }
c:\intersystems\cache\mgr\journal\20190620.003
c:\intersystems\cache\mgr\journal\20190620.002
c:\intersystems\cache\mgr\journal\20190620.001
c:\intersystems\cache\mgr\journal\20190610.001

B) %SYS.Journal.Record类中的List查询
这个查询可以从指定journal日志文件中获取日志记录

USER>set rs2=##class(%ResultSet).%New("%SYS.Journal.Record:List")

USER>do rs2.Execute("c:\intersystems\cache\mgr\journal\20190620.003")   
         
USER>while rs2.Next() { if rs2.Get("GlobalReference")["TEST" write rs2.Get("GlobalReference"),!}
^["^^c:\intersystems\cache\mgr\user\"]TEST(1)
......
^["^^c:\intersystems\cache\mgr\user\"]TEST(9)
^["^^c:\intersystems\cache\mgr\user\"]TEST(10)

这里我们可以把从A查询获得的结果传到B查询里。如果想了解从B查询里还能获得哪些字段的内容,请参考文档里的%SYS.Journal.Record类定义

下面是一个把A和B查询合并在一起的例子:

///参数 globalname: 需要查询的Global名字(不包括^)
ClassMethod SearchAllJournals(globalname As %String)
{
 if $get(globalname)="" {
   write "请指定Global名字",!
   quit
 }
 //从当前所有journal日志文件中搜索指定的global
 set rs1=##class(%ResultSet).%New()
 set rs1.ClassName="%SYS.Journal.File"
 set rs1.QueryName="ByTimeReverseOrder"
 do rs1.%Execute()
 while rs1.%Next() {
   set jrnfile=rs1.%Get("Name")
   set size=rs1.%Get("Size")
   write "Journal file:",jrnfile,!," File size:",size/1024/1024," MB",!
   do ..SearchGlobal(globalname,jrnfile)
 }
 do rs1.Close()
}

///第一个参数 globalname: 需要查询的Global名字(不包括^)
///第二个参数 jrnfile: 指定的journal日志文件名字(包括路径)
ClassMethod SearchGlobal(globalname As %String, jrnfile As %String)
{
 set rs1=##class(%ResultSet).%New()
 set rs1.ClassName="%SYS.Journal.Record"
 set rs1.QueryName="List"

 //打开journal日志文件并搜索指定的Global
 do rs1.%Execute(jrnfile,"GlobalReference,NewValue",,,$lb("GlobalReference","[",globalname))
 
 while rs1.%Next() {
   set glo=rs1.%Get("GlobalReference")
   write " ",glo," = ",rs1.%Get("NewValue"),!
 }
 do rs1.Close()
}
10
1 1 0 36
Log in or sign up to continue