Published on InterSystems Developer Community (https://community.intersystems.com)

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

文章
TZ Zhuang · 八月 6, 2021 阅读大约需 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()
}
#ObjectScript #日志 #Caché #Ensemble #InterSystems IRIS #InterSystems IRIS for Health

源 URL:https://cn.community.intersystems.com/post/faq-%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98%E7%B3%BB%E5%88%97-%E7%B3%BB%E7%BB%9F%E7%AE%A1%E7%90%86%E7%AF%87-%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%E5%91%BD%E4%BB%A4%E5%9C%A8journal%E6%97%A5%E5%BF%97%E6%96%87%E4%BB%B6%E4%B8%AD%E6%90%9C%E7%B4%A2%E6%8C%87%E5%AE%9A%E7%9A%84global