21

現在取り組んでいるWebアプリケーションへのログインを実装することを計画していますが、詳細のいくつかに苦労しています。Java Webアプリケーションをログに記録するための最良の方法は何ですか?

具体的には;

  • 構成ファイルは.warパッケージファイルのどこにありますか?
  • 人々はどこにログオンしますか、相対パスまたは絶対パスのフラットファイル、またはデータベースですか?
  • Log4Jログはアプリケーションサーバーのログファイルに直接自動的に記録されますか、それとも設定する必要がありますか?この場合、Tomcatを使用していますが、Jrunをよく使用します。
  • Webアプリケーションのロギングについて知っておくべき他の落とし穴はありますか?

現在、私はLog4Jを使用していますが、ベストプラクティスはすべてのロギング実装に普遍的に適用されると思います。

編集:
一番上の質問への1つの追加。

  • ログ構成をどこで初期化しますか?

従来のアプリでは、これはエントリポイントで行います。

DOMConfigurator.configureAndWatch("log4j.xml");

同等のWebアプリケーションは何でしょうか?

4

12 に答える 12

11

SLF4Jの使用をお勧めします。これは、一般的なロギングシステム( Log4jcommons-loggingJava Logging APILogback )のほとんどをサポートするシンプルなロギングファサードです。これを使用すると、簡単なCLASSPATHの更新によって、アンダースコアロギングシステムを他のシステムに置き換えることができます。

SLF4Jのもう1つの利点は、パラメーター化された呼び出しです。これにより、醜いロギングコードが削減されます。

実際には、LogbackでSLF4Jを使用することをお勧めますLogbackLog4Jの後継です。そしてそれは同じ作者によって設計されました。

于 2009-03-05T18:42:39.673 に答える
8

設定ファイルは .war パッケージ ファイルのどこに置かれますか? クラスパスのルート。

相対パスまたは絶対パスのフラット ファイル、またはデータベースのどこにログを記録しますか? 必要に応じて異なります。常に相対パスを使用することをお勧めします。データベースからログを取得し、電子メール/SMS を使用して送信する別のアプリケーションを実装する場合、データベースは適切です。

Log4J のログは自動的にアプリケーション サーバーのログ ファイルに直接記録されますか?それとも何か設定する必要がありますか? 今回はTomcatを使っていますが、よくJrunを使っています。 コンソール アペンダーを使用している場合は、サーブレット コンテナーのログ ファイルに記録されます。

Web アプリケーションのログ記録について知っておくべきその他の落とし穴はありますか? 別のスレッドからログを記録している場合は、 logbackを使用します。これはスレッドセーフであり、パラメーター化されたログ メッセージを公開します。

于 2009-03-05T13:13:04.987 に答える
6

DBにログを記録すると、別の障害点が追加されます。prodサーバーがDBにログインし、誰かがそのDBに対して高額なクエリを実行したために、prodサーバーの速度が非常に遅くなり、非常に遅くなるという状況が発生しました。ファイルにログを記録すると、容量が不足した場合に問題が発生する可能性がありますが、アプリ全体の速度が低下する可能性は低いようです。

于 2009-03-05T15:01:31.203 に答える
4

構成をデフォルトのパッケージに配置します:src /

${catalina.home}システムプロパティを使用してファイルにログインします。

log4j.appender。???。file=$ {catalina.home}/logs/system.log
于 2009-03-05T13:07:27.857 に答える
2

管理者が Web アプリを再構築せずに変更できる場所に構成ファイルを配置することをお勧めします (たとえば、夜中に起こされずに詳細なログを有効にすることができます)。

残念ながら、Web アプリから外部化されたリソースを見つけるための「公式な」方法はありません (間違っていたら訂正してください)。私が見た最も一般的な方法は、クラスパス内のディレクトリを調べることです。

于 2009-03-05T13:27:50.350 に答える
1

優れた論文であるHow to Do Application Logging Rightには、多くの落とし穴があります。

あなたの他の質問は、このページの他の人によって回答されていると思います.

また、SLF4J を使用することをお勧めします。

最後にもう 1 つ:オブジェクトの音声表現を使用すると、時間を節約できます。

于 2012-10-30T23:05:17.473 に答える
0

少しのロギングが必要な場合、サーブレット標準では、ServletContextを取得し、そこでログメソッドを使用できると指定されていることに注意してください。これは、System.out.printlnに相当する汎用サーブレットです。

于 2009-03-05T18:08:21.363 に答える
0
  • 構成ファイルは.warパッケージファイルのどこにありますか?

通常、私はログ設定をアプリケーションに配置せず、サーバー全体でログを設定するためにappserver管理者に任せます。まれに、log4j構成をWebアプリでデプロイしたい場合、WEB-INFが通常のパスです。

  • 人々はどこにログオンしますか、相対パスまたは絶対パスのフラットファイル、またはデータベースですか?

繰り返しますが、appserverの設定によって異なります。appserverの一般的なログファイルの1つであり、毎日ローテーションするのが通常のセットアップです。アプリ固有のニーズがある場合、管理者はアプリ用に個別のログファイルを構成できます(パッケージ/クラス名で区別されます)。

  • Log4Jログはアプリケーションサーバーのログファイルに直接自動的に記録されますか、それとも設定する必要がありますか?この場合、Tomcatを使用していますが、Jrunをよく使用します。

上記を参照。開発目的で使用されるTomcatの場合、ログ(log4j)構成を探し、そこに特定のアプリ固有のものを追加します。

  • Webアプリケーションのロギングについて知っておくべき他の落とし穴はありますか?パフォーマンス。ライブに移行したら、ログレベルを最小値(つまり、WARNまたはERROR)に制限します。if (log.isDebugEnabled()) { log.debug("..."); }コードで同様の構造を使用 します。
于 2009-03-05T14:56:50.340 に答える
0

個人的には、log4j.properties を WEB-INF ディレクトリに置き、次のコードで init サーブレットを使用します。

public class InitServlet extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet {

private static final String LOG4J_FILE = "WEB-INF/log4j.properties";

public InitServlet() {
    super();
}

@Override
public void init() throws ServletException {
    super.init();
    PropertyConfigurator.configure(getServletContext().getRealPath(LOG4J_FILE));
    LogFactory.getLog(InitServlet.class).info("LOG 4J configured");
}

}

于 2009-03-05T13:15:07.073 に答える
0
  • 設定ファイルは .war パッケージ ファイルのどこに置かれますか?

クラスパスのルートですが... 構成ファイルを war パッケージに入れないでください。ロギング構成を変更した場合、アプリケーションを再パッケージ化して再デプロイしたくありませんか? 構成ファイルを war の外のクラスパスのどこかに置くことをお勧めします。

  • 相対パスまたは絶対パスのフラット ファイル、またはデータベースのどこにログを記録しますか?

私は通常、別のパーティションのファイル システムにログを記録します (ログ ファイルは非常に急速に大きくなる可能性があり、大きくなりすぎてもアプリケーションやオペレーティング システムをブロックすることはありません)。ほとんどの場合、次のモデルに基づく絶対パスを使用します: /var/projects/<PROJECT_NAME>/<PRODUCT>/<CLUSTER_NAME>/logs/<INSTANCE_NAME>.log <PROJECT_NAME> はプロジェクト名、<PRODUCT> <CLUSTER_NAME> はクラスターの名前、<INSTANCE_NAME> はクラスター内のインスタンスの名前です。ファイル システムへのログ記録は、データベースよりも高速です。欠点は、複数のインスタンスと物理マシンを使用している場合、ログが集中化されないことです。しかし、マージはスクリプトで簡単に行うことができます。

  • Log4J のログは自動的にアプリケーション サーバーのログ ファイルに直接記録されますか?それとも何か設定する必要がありますか? 今回はTomcatを使っていますが、よくJrunを使っています。

アプリケーション サーバー ログはアプリケーション サーバー ログであり、アプリケーション ログではありません。それらに書き込むのではなく、ロガー ツール (log4j など) をセットアップし、アプリケーション ログに書き込みます (専用と理解してください)。

  • Web アプリケーションのログ記録について知っておくべきその他の落とし穴はありますか?

log4j を使用している場合は、ログを記録する前に isDebugEnabled() を使用することを忘れないでください。

if(logger.isDebugEnabled()) {
  logger.debug("Bla Bla Bla");
}
于 2009-03-05T14:27:36.183 に答える
0
  • log4j をコンテナー (サーバー) に配置し、アプリケーションごとに適切なアペンダーを作成します
  • サーバーパスに相対的ですが、それはニーズに依存します
  • 必要に応じて、さまざまなファイルにログを記録するアペンダーを使用します。たとえば、休止状態の情報/統計用のファイル、アプリケーション専用のファイルなどです。
  • あまりログに記録しないでください。アプリケーションの速度が低下します
于 2009-03-05T13:09:25.747 に答える