検索

記事
· 2024年7月7日 4m read

監査ログをファイル出力する方法

これは InterSystems FAQ サイトの記事です。

監査ログはシステムDB内テーブル(%SYS.Audit)に記録されていますので、そのテーブルに対するクエリを実行して抽出したり、%SYS.Auditテーブルに用意されていストアドプロシージャを利用して情報を取得しファイル出力するようにプログラムを用意することもできます。

以下にご紹介する内容は「監査ログをプログラムで出力(ユーザやイベント指定など)する方法」に関連した内容で、監査ログのファイル出力を管理ポータルの機能を利用した例とプログラムを利用した例でご紹介します。

 

1. 管理ポータルの印刷機能を使う

管理ポータル > [システムエクスプローラ] > [SQL]を開き、%SYSネームスペースに接続します。

システムのチェックを入れ、スキーマに%SYSを指定した後、プロシージャの階層を展開するとプロシージャリストが参照できます。

%SYS.Audit_ で始まるプロシージャが監査ログに対して実行できるプロシージャです。

SQL文例)InterSystems製品内ユーザのSuperUserに対する監査ログをストアドプロシージャ:%SYS,Audit_ListByUser を利用して出力しています。

call %SYS.Audit_ListByUser(,,,,,'SuperUser')

引数については、クラスリファレンス:%SYS.Audit_ListByUserをご参照ください。

管理ポータル内の「印刷」の機能を利用するとファイル出力できます。

2. プログラムでファイル出力する

%SYS上に以下のようなメソッド(またはルーチン)を用意すると任意のカラムのみを出力できます。

注意:クラスの場合はパッケージ名の先頭文字にZを、ルーチンの場合はルーチン名の先頭にZをつけて保存してください。

%SYS.AuditクラスのListByUserプロシージャはクラスクエリとしても実行できるため、コード例ではクラスクエリで実行しています。

また出力するカラムもTimeStampとEventDataのみとしています。

Class ZAudit.Utils
{
/// 第1引数:出力ファイル名をフルパスで指定します。
/// 第2引数:ユーザ名を指定します。
ClassMethod OutputToFile(fname As %String, user As %String = "SuperUser")
{
    set fo=##class(%Stream.FileCharacter).%New()
    do fo.LinkToFile(fname)
    
    //SQL実行用インスタンスを生成
    set stmt=##class(%SQL.Statement).%New()
    
    //定義されているストアドプロシージャはクラスクエリの形式でも利用できます。
    //例ではクラスクエリを実行する方法を記載しています。
    set status=stmt.%PrepareClassQuery("%SYS.Audit","ListByUser")
    set rset=stmt.%Execute(,,,,,user)  //第6引数に調査したいユーザ名を指定
    
    #dim rset As %SQL.StatementResult
    //TimeStamp と EventDataを出力します
    do fo.WriteLine("TimeStamp,EventData")
    while rset.%Next() {
        do fo.Write(rset.%Get("TimeStamp")_",")
        do fo.WriteLine(rset.%Get("EventData"))        
    }
    set status=fo.%Save()
    kill fo
}
}

実行例は以下の通りです。

 %SYS>do ##class(ZAudit.Utils).OutputToFile("/usr/irissys/mgr/user/t2.csv","SuperUser")

 

注意:バージョン2022.1.3以前で実行する場合

EventDataプロパティが参照できないので以下コード例のように実行してください。

ClassMethod OutputToFile2(fname As %String, user As %String = "SuperUser")
{
    set fo=##class(%Stream.FileCharacter).%New()
    do fo.LinkToFile(fname)

    //SQL実行用インスタンスを生成
    set stmt=##class(%SQL.Statement).%New()

    //定義されているストアドプロシージャはクラスクエリの形式でも利用できます。
    //例ではクラスクエリを実行する方法を記載しています。
    set status=stmt.%PrepareClassQuery("%SYS.Audit","ListByUser")
    set rset=stmt.%Execute(,,,,,user)  //第6引数に調査したいユーザ名を指定
    #dim rset As %SQL.StatementResult
    //TimeStamp と EventDataを出力します
    do fo.WriteLine("TimeStamp,EventData")
    while rset.%Next() {
        set utc=rset.%Get("UTCTimeStamp")
        set sid=rset.%Get("SystemID")
        set aid=rset.%Get("AuditIndex")
        set stauts=##class(%SYS.Audit).Get(utc,sid,aid,.data)
        do fo.Write(rset.%Get("TimeStamp")_",")
        do fo.WriteLine($get(data("EventData")))
        kill data
    }
    set status=fo.%Save()
    kill fo
}
ディスカッション (0)1
続けるにはログインするか新規登録を行ってください
ダイジェスト
· 2024年7月7日

InterSystems 开发者社区中文版:每周摘要(2024年7月1日-7日)

七月 01 - 07, 2024Week at a GlanceInterSystems Developer Community
記事
· 2024年7月7日 1m read

InterSystems 常见问题系列,如何避免ODBC查询超时

InterSystems 常见问题系列FAQ

如果要让超时功能失效, 在DSN设置查询超时为disabled:

Windows Control Panel > Administrative Tools > Data Sources (ODBC) > System DSN configuration

如果勾选了Disable query timeout , 超时就会失效.

如果想在应用侧修改,你可以在ODBC API 层设置:在连接数据源之前,调用ODBC SQLSetStmtAttr功能设置SQL_ATTR_QUERY_TIMEOUT 属性 

ディスカッション (0)0
続けるにはログインするか新規登録を行ってください
記事
· 2024年7月7日 1m read

InterSystems 常见问题系列 如何在启动时执行特定动作

InterSystems 常见问题FAQ

如果您想在InterSystems 产品启动时执行一个操作系统可执行文件,命令或者程序,可以在SYSTEM^%ZSTART routine里面写明流程 ( %ZSTART routine在 %SYS 命名空间里面创建).

在 SYSTEM^%ZSTART 里面写代码之前, 请确保他可以在任何情况下能正常工作

如果 ^%ZSTART routine 写的不对,或者没有响应或者发生错误,InterSystems 产品可能会无法启动。

更多信息,请参考一下文档。

About writing %ZSTART and %ZSTOP routines [IRIS]
About writing %ZSTART and %ZSTOP routines

ディスカッション (0)0
続けるにはログインするか新規登録を行ってください
記事
· 2024年7月7日 4m read

InterSystems 常见问题系列 如何检查数据大小

InterSystems  常见问题系列FAQ

InterSystems 产品里数据 (表、对象、实例数据) 是存在global 变量里的。
每个global 的数据大小可以从管理门户中中点击属性查看Management Portal > System > Configuration > Local Database > Globals page, 然后在global 属性页点击计算大小Calculate Size 按钮。
你可以在终端上调用^%GSIZE  来在命名空间里显示数据大小,方法如下.

USER>do ^%GSIZE
 
Directory name: c:\intersystems\ensemble\mgr\user\ =>
All Globals? No => Yes
^DeepSee.ActiveTasks contains no data
Include it anyway? No => Y
Include any other similar globals without asking again? Yes =>
^DeepSee.ActiveTasks contains no data
Include it anyway? No => Yes
Include any other similar globals without asking again? Yes => Yes
^DeepSee.FeatureStats contains no data -- included
^DeepSee.Session contains no data -- included
^oddBIND     contains no data -- included
^oddMETA     contains no data -- included
^oddStudioDocument contains no data -- included
^oddStudioMenu contains no data -- included
^rINCSAVE    contains no data -- included
91 items selected from
91 available globals
Show details?? No => Yes
Device:
Right margin: 80 =>
directory: c:\intersystems\ensemble\mgr\user\                                   Page: 1                           GLOBAL SIZE                        26 Jun 2017
                                                                         6:56 PM
      Global        Blocks       Bytes Used  Packing   Contig.
      --------    --------  ---------------  -------   -------
      CacheMsg           1            3,812     47 %         0
      DeepSee.ActiveTasks
                         1               24      0 %         0
      DeepSee.AgentLog
                         1            6,008     74 %         0
      DeepSee.Agents
                         1              688      8 %         0
      DeepSee.BucketList
                         1               76      1 %         0
      DeepSee.Cache.Axis
                        25          142,616     70 %        14
      DeepSee.Cache.Listing
                        15           87,728     72 %        11
      DeepSee.Cache.Results
                        31          183,200     72 %        17
      DeepSee.Cubes
                         3           17,936     73 %         0
                                         to continue or '^' to STOP:
ディスカッション (0)0
続けるにはログインするか新規登録を行ってください