4

私たちは Apache Tomcat 7 を使用しており、Valve コンポーネントをセットアップしてアクセス ログを保存し、SnowPlowで処理できるようにしようとしています。

私たちが抱えている問題は、これらのログを堅牢にする方法です。例を挙げると、フィールドをタブで区切り、次のようにユーザー エージェント文字列を抽出できます。

pattern="%{yyyy-MM-dd}t	%{hh:mm:ss}t	%{User-Agent}i	"

問題は、Valve コンポーネントが (私が見る限り) エスケープしないことです%{User-Agent}i。そのため、ユーザー エージェントの迷子のタブがデータを破損します (行は 3 つではなく 4 つのフィールドを含むように見えます)。

解決策に関しては、私が見逃したユーザーエージェントをエスケープする方法がない限り、いくつかの解決策を見ることができます:

  1. useragent 文字列に含まれる可能性が非常に低い、非常にあいまいなフィールド区切り記号 (またはフィールド区切り記号の組み合わせ) を使用します。Ctrl-A (HTML ?) を試しましたが、うまくいかなかったようです
  2. AccessLogValveエスケープをサポートするか、タブをサニタイズするカスタムを作成します - おそらくこの投稿のサニタイズ Tomcat アクセス ログ エントリに似ています

これについてオンラインで他に何も見つからないことに少し戸惑いました-Tomcatアクセスログを解析する人はいませんか?

おすすめは何ですか?少し立ち往生しています...

4

2 に答える 2

1

RFC2616は、ユーザーエージェント文字列を次のように定義しています。

User-Agent     = "User-Agent" ":" 1*( product | comment )

次に、製品は次のように定義されます。

product         = token ["/" product-version]
product-version = token

これに続いて、トークンは次のように定義されます

token          = 1*<any CHAR except CTLs or separators>

およびセパレーター/CTLとして

separators     = "(" | ")" | "<" | ">" | "@"
                      | "," | ";" | ":" | "\" | <">
                      | "/" | "[" | "]" | "?" | "="
                      | "{" | "}" | SP | HT
CTL            = <any US-ASCII control character
                    (octets 0 - 31) and DEL (127)>

を忘れる必要はありませんcomment

comment    = "(" *( ctext | quoted-pair | comment ) ")" 
ctext      = <any TEXT excluding "(" and ")">
quoted-pair    = "\" CHAR
CHAR           = <any US-ASCII character (octets 0 - 127)>

ですから、私が正しく理解していれば、とで囲まれているを区別できる限り、どれseparatorでも使用できるはずです。コメント内に表示される場合は、でエスケープする必要があります。CTLcomment()(\

于 2012-11-28T09:56:16.837 に答える