4

プログラム出力をファイルにリダイレクトする方法の例はたくさんあります。
ファイルの最大サイズを設定してファイルをロールする (古いメッセージを消去する) か、古いファイルをバックアップして新しいファイルへのログ記録を開始する必要があります。

OSコアのものを使用してこれを行う方法はありますか?

私の顧客は、アプリケーションごとにログ ファイルを作成し、そこからすべての標準出力をログに記録することに私を困惑させました。
アプリケーションは長時間実行されるアプリケーションであり、個別の JVM で開始され (つまり、これらは複数のアプリケーションです)、同じ log4j.properties ファイルを使用する複数のモジュールが含まれています。
私は Java と log4j を使用していますが、log4jはアプリケーションごとではなくパッケージごとにログを記録します。また、2 つのモジュールが同じパッケージ (ロガー カテゴリ) を持つ可能性がありますが、異なるファイルに向けられる必要があるため、私には適していません。
アプリケーション モジュールは、.sh スクリプトを使用して開始されます。

ありがとう

4

4 に答える 4

3

log4j はパッケージ単位でログを記録しません。好きな名前を付けることができます。

log4j.xml に、これを追加します。

<appender name="USERACTION" class="org.apache.log4j.DailyRollingFileAppender">
    <param name="File" value="/var/logs/useraction.log" />
    <param name="DatePattern" value="'.'yyyy-MM-dd" />
    <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%d%m%n" />
    </layout>
</appender>

<logger name="UserAction" additivity="false">
    <level value="INFO" />
    <appender-ref ref="USERACTION" />
</logger>

次のようにロガーをインスタンス化します。

private final static Logger LOG = Logger.getLogger("UserAction");

このロガーに記録されたものはすべて、ファイル useraction.log に記録されます。相関関係がわかりますか?

現在のクラスにちなんでロガーに名前を付けることは便利ですが、決して必須ではありません。

ログエントリを区別するためにこれをよく使用します。私のクラスの中には、ユーザー アクション用、低レベルのもの用、サービス コール用など、複数のロガー インスタンスがあるものがあります。

于 2012-04-26T14:20:59.667 に答える
2

ロギング構成のシステム プロパティに応じて、log4j に異なるファイルを使用させることができます。(このアペンダーはlog4j エクストラプロジェクトにあります) 例

  <appender name="R2" class="org.apache.log4j.rolling.RollingFileAppender">
    <rollingPolicy class="org.apache.log4j.rolling.TimeBasedRollingPolicy">
      <param name="FileNamePattern" value="logs/log_${appName}.log.%d" />
      <param name="ActiveFileName" value="logs/log_${appName}.log" />
    </rollingPolicy>
    <layout class="org.apache.log4j.PatternLayout">
      <param name="ConversionPattern" value="%d [%t] %c -\n  %-5p: %m%n" />
    </layout>
  </appender>

参照${appName}: を使用して、これを起動パラメータとして vm に渡すことができます-DappName=MyApp。を使用して実行時にこれを設定することもできますSystem.setProperty(.., ..)が、これは log4j が初期化される前に行う必要があります。プロパティの値は、ランチャー プロセスによって決まります。

のようなログ ファイルが作成されますlog_MyApp.log

編集: 申し訳ありませんが、プロパティ ファイルを使用していて、サイズ ベースのローリング ポリシーが必要であるという事実を見逃していました。このファイルに次のように記述できます (ただし、実際のトリックは同じです)。

log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File={myApp}.log
log4j.appender.R.MaxFileSize=100KB
log4j.appender.R.MaxBackupIndex=1

これはより完全です: http://logging.apache.org/log4j/1.2/manual.html :)

于 2012-04-26T14:15:06.657 に答える
2

アプリケーションが にログインできる場合、stdout役立つツールがいくつかあります。たとえば、次のとおりです。

  • 回転ログ、Apache の一部。これstdinは、時間に基づいてログファイルを読み書きします。必要に応じてログファイルを変更します。などの簡単なツールを使用して、古いログ ファイルをクリーンアップできますfind -mtime ...

  • svlogd、の一部runit。これは に似てrotatelogsいますが、必要に応じて古いファイルの削除を自動的に処理し、時間ベースのローテーションではなくサイズ制限で機能します。

  • スーパーバイザなどのプロセス マネージャでプログラムを実行する場合、プロセス マネージャは出力のロギング、ログファイルのローリングなどを処理できます。

他にも同様のソリューションが数多くあります...Java 固有のアイデアも数多くあると思いますが、それは他の人に任せます。

于 2012-04-26T14:09:12.050 に答える
2

これは私に最適です(System.errとSystem.outを同じログファイルにリダイレクトし、ファイルをサイズごとに分割します):

java MyApp 2>&1 | split -b500k - out.log

ありがとう、みんなに投票しました;)

于 2012-04-26T15:57:34.083 に答える