0

タイプの文字列でいっぱいのデータベースが 1 つあります。

ブロックを書き込めません。EOM のデバイス。dev=$device ($device_path)

そして、たとえば次のようなログエントリを生成するプログラムがあります

2013-10-10 15:37:07program-sd JobId 50345: 致命的なエラー: block.c:434 ブロックを書き込めません。EOM のデバイス。dev="st0" (/dev/st0)

したがって、使用できますSELECT * FROM X WHERE Y LIKE="%LOG%"が、文字列は同じではありません。データベースにはクリーンな文字列がありますが、ログにはタイムスタンプ、詳細情報、および と のデータが$deviceある$device_pathため、クエリは 0 の結果を返します。どっちも似合わないから…

データベースにあるものに基づいてエラー コードを返そうとしています。この例ではRC: 1019、クエリの結果が 0 でない場合になります...

これを達成するために正規表現または何かを使用する方法はありますか?

4

1 に答える 1

1

エラー メッセージ テンプレートのテーブルが次のようになっているとします。

create table error_templates(id serial primary key, template text);

次に、次のようなクエリを使用できます。

select id 
from error_templates 
where $1 like '%' || regexp_replace(template, '\$\w+', '%', 'g') || '%';

$1 は、検索しようとしているエラー ログのプレースホルダーです。

regex_replace は、メッセージ内の変数を % に置き換えます。変数は、ドル記号とそれに続く 1 つ以上の単語文字 (a-zA-Z0-9_) で構成されていると想定しています。実際の変数名に応じて、これを調整する必要がある場合があります。

また、これは遅くなる可能性があることに注意してください。テーブル全体をスキャンする必要があります。インデックスは使用できません。

于 2013-12-05T11:41:17.177 に答える