0

次のようなログ形式文字列を定義しました。

[%Time%] %Logger%.%Level%: %Message% ${$%Context%$}$ $\n$%Extra%\n

さらに、%-Keys の置き換えに加えて、%Context%-Key の近くのような条件を定義できるようにしたいと考えています。

したがって、%Context% が空の場合は、完全な ${$%Context%$}$ をスキップします。%Context% が空でない場合は、プレフィックス { とサフィックス } も出力します。

私はこれを試しました(ループ内でキーを置き換える予定でした):

$output = '';
$subject = '[%Time%] %Logger%.%Level%: %Message% ${$%Context%$}$ $\n$%Extra%\n';
$output .= preg_replace('/(\$(.*|^\$)\$)?%Context%(\$(.*|^\$)\$)?/', '\2test\4', $subject);

私が期待するもの(コンテキストが空):

[%Time%] %Logger%.%Level%: %Message% $\n$%Extra%\n

私が期待するもの(コンテキストが空ではない):

[%Time%] %Logger%.%Level%: %Message% {test} $\n$%Extra%\n

私が得るもの(コンテキストが空ではない):

[%Time%] %Logger%.%Level%: %Message% {test}$ $\n%Extra%\n

そして、最後の $ がどこから来たのかわかりません。

4

1 に答える 1

0

これが 1 つの解決策です。ループと if 条件を使用して問題を解決します。

$output = '';
$subject = '[%Time%] %Logger%.%Level%: %Message% ${$%Context%$}$ $\n$%Extra%\n';
$replace = array('Hello', 'World', '');
$pattern = '/(\${1}([^\$]+)\${1})?%Context%(\${1}([^\$]+)\${1})?/';

foreach ($replace as $r)
{
    if ($r == '')
    {
        $output .= preg_replace($pattern, '', $subject) . '<br>';
    }
    else
    {
        $output .= preg_replace($pattern, '$2' . $r . '$4', $subject) . '<br>';
    }
}

出力:

[%Time%] %Logger%.%Level%: %Message% {Hello} $\n$%Extra%\n
[%Time%] %Logger%.%Level%: %Message% {World} $\n$%Extra%\n
[%Time%] %Logger%.%Level%: %Message% $\n$%Extra%\n
于 2013-09-05T11:56:58.963 に答える