0

Restlet サーブレットのログ ファイルで特定の要求を追跡する最良の方法は何ですか?

同時に複数のリクエストがある場合、ログファイルで単一のリクエストを追跡できるようにしたいと考えています。

私は slf4j Restlet 拡張機能を使用しているので、slf4j.MDC を使用して、ソース IP + ポート + タイムスタンプのハッシュを追加することを考えました。または、リクエストごとに増加する数。

しかし、おそらく別の簡単な方法がありますか?

4

1 に答える 1

2

おそらく、スレッド ID を使用する方が簡単で、各リクエストの開始と終了をログに記録するようにしてください。これにより、追加のコーディング (または CPU サイクル) なしで、必要なものが得られます。

更新

スレッドごとに複数のリクエストを実行している場合は、おそらくランダム ID を生成し、それを追跡に使用する必要があります。何かのようなもの:

import java.security.SecureRandom;

public class StringUtils
{
  private static final SecureRandom RANDOMSOURCE;
  private static String CANDIDATES = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";

  static
  {
    RANDOMSOURCE = new SecureRandom();
  }

 /**
  * Generate a random string of alphanumeric characters.
  * <p>
  * The string returned will contain characters randomly
  * selected from upper- and lower-case a through z as
  * well as the digits 0 through 9.
  * @param length the length of the string to generate
  * @return a string of random alphanumeric characters of the requested length
  */
  public static String generateRandomString(int length)
  {
    final StringBuffer sb = new StringBuffer(length);
    for (int i = 0; i < length; i++)
    {
      sb.append(CANDIDATES.charAt(RANDOMSOURCE.nextInt(62)));
    }
    return sb.toString();
  }
}

そして、あなたが言うように、MDC を使用して各リクエストのリクエスト ID を作成し、詳細をフィルターに記録することができます (これは Jersey フィルターですが、Restlet の場合と似ているはずです)。

  ...
  private static final String REQUESTHIDEADER = "Request-ID";
  private static final String REQUESTID = "REQUESTID";
  private static final String REQUESTSTARTTIME = "RSTARTTIME";

  @Override
  public ContainerRequest filter(final ContainerRequest request)
  {
    final String requestid = Long.toHexString(Double.doubleToLongBits(Math.random()));
    MDC.put(REQUESTID, requestid);
    MDC.put(REQUESTSTARTTIME, String.valueOf(System.currentTimeMillis()));
    if (LOGGER.isInfoEnabled())
    {
      LOGGER.info("Started: {} {} ({})", request.getMethod(), request.getPath(), requestid);
    }

    return request;
  }

  @Override
  public ContainerResponse filter(final ContainerRequest request, final ContainerResponse response)
  {
    try
    {
      final Long startTime = Long.parseLong(MDC.get(REQUESTSTARTTIME));
      final String rid = MDC.get(REQUESTID);
      final long duration = System.currentTimeMillis() - startTime;
      response.getHttpHeaders().add(REQUESTHIDEADER, rid);
      LOGGER.info("Finished: {} {} ({} ms)", request.getMethod(), request.getPath(), String.valueOf(duration));
    }
    catch (Exception e)
    {
      LOGGER.warn("Finished {} {}", request.getMethod(), request.getPath());
    }
    return response;
  }

おまけとして、これはリクエスト ID をリクエスターに戻して、問題が発生した場合の追跡を可能にします。

于 2013-02-02T16:28:47.183 に答える