もちろん、PerlでXMLファイルを読み取る方法はたくさんあります。XML::ParserやXML::LibXMLなどです。
XML::Parserから始めます。XML :: LibXMLは長期的には優れているように見えますが、XML::Parserの方がはるかに快適だと感じています。
編集:あなたがあなたの質問を編集したので、私は私の応答が適切ではないことがわかります。明らかに、パターン(上記のXMLモジュールまたは単純な正規表現が必要になる可能性があります)を取得することは問題にはなりません。残念ながら、パターンの可能なフォーマットオプションはわかりません。複雑なようです。
各行に適用できるパターンに基づいて正規表現を作成します。
この特定のケースでは、正規表現は次のようになります。
(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}:\d{2}.\d{3})\s\[(.*?)\]\s\{(.*?)\}\s(.*?*) - (.*)(\d*)
私はPerlを知っていますが、メッセージ形式を知らないので、推測することしかできません。slf4jのフォーマットアトムはパターンに従うと思います。%-?\w+(\{.*?\}|)
つまり、パーセント記号、オプションのマイナス、英数字、そしてオプションで中括弧内のいくつかの追加のフォーマットオプションです。
XMLフォーマット命令を解析し、パターンを変数に正常に抽出できたと$pattern
すると、次のようになります。
$pattern =~ s/%-?\w+(\{.*?\}|)/(.*?)/g
サンプルパターンに適用すると、次の正規表現が生成されます。
(.*?) [(.*?)] {(.*?)} (.*?) (.*?) - (.*?)(.*?)
ログファイルのすべての行と照合できます。
@parsed = ( $line =~ /$pattern/ )
これはまだ完全ではなく、失敗します。日付形式を認識し、%nと%msgを区別する必要があります(%nには数字しか含めることができないと思いますが、そうでない場合は問題があります)。ただし、これがどこに向かっているのかがわかります。お役に立てば幸いです。