0

PaperTrail のフィルター ログ ツールを使用して、RegEx を使用して特定のパスを除外しようとしています。ログ文字列は次のいずれかのようになります。

通過してはならず、ログに記録されるべきではありません

Sep 03 10:12:40 lastmingear heroku/router:  at=info method=GET path="/orders/SOME_ID?key=USER_KEY" host=www.lastmingear.com...

合格し、ログに記録する必要があります

Sep 03 10:12:40 lastmingear heroku/router:  at=info method=GET path="/orders/SOME_ID?key=USER_KEY&log=true" host=www.lastmingear.com...

唯一の違いは、ログに記録するパスに追加の params があることlog=trueです。したがって、RegEx ステートメントは次のように口頭で読む必要があります。

IF akey=USER_KEYが指定されている場合は、ログに渡さないでください。log=true

4

2 に答える 2

2

正規表現を使用できますが、通常、クエリ文字列をそのようなパターンと照合することは悪い習慣と見なされています。パラメータの順序が異なる場合はどうなりますか? それらの間に他のパラメータがある場合はどうなりますか? URL エンコードされている場合はどうなりますか?

代わりに、クエリ文字列を解析してキーと値のペアを分析することを検討してください。

require 'uri'

def log?(log_line)
  path = log_line[/path="([^"]+)"/, 1]
  uri = URI(path)
  params = URI.decode_www_form(uri.query).to_h
  not params['key'] or params['log'] == 'true'
end

更新: これは、if-this-then-that-or-etc を言う方法がないため、解決するのが難しい正規表現の問題です。正規表現で。アサーションを使用できますが、これまでのところしか取得できません。基本的に、渡したいすべてのパターンを列挙する必要があります。これは非常に脆弱であることを強調したいと思います。パターンに変化があるかどうかを確認するために、時間をかけて監視する必要があります。

このパターンは、/orders ルートのログ行を、注文番号とオプションのクエリ文字列に一致させます。クエリ文字列が指定されている場合は、指定されたパターンのいずれかに一致する必要があります。数値キー番号が指定されている場合、ログは true でなければなりません。

/path="\/orders\/\d+
  (?:\?
    (?:(?!(?<=[?&])key=\d+(?=[&"])).)*?
    |(.+?&)?log=true(&.+?)?
  )?
"/x
于 2016-09-03T18:17:01.670 に答える
0

彼が与えた理由から@mwpの答えを好みますが、次の正規表現の何が問題になっていますか:

/path="[^"]+?\&log=true.*?"/

すべての非貪欲な引用符を非貪欲に一致&log=trueさせます。

于 2016-09-03T19:16:29.423 に答える