1

私のアプリケーションでは、スタッフ、学生のようなユーザーがいます..、これらのユーザーは、スタッフがスタッフと学生モジュールにのみアクセスできるように、一部のモジュールにのみアクセスできます。学生は学生モジュールにのみアクセスできますが、すべてのモジュールにアクセスできる管理者と呼ばれるユーザーがいます. 私の要件は、管理者がアプリケーションのモジュールを変更したとき、元のデータを保存し、データを file.log に変更する必要があり (私は log4j、spring、hibernate を使用しています)、そのファイルをメールから特定のユーザーに送信しています。

私を助けてください。

ありがとうございました

4

2 に答える 2

0

わかりました。セッションごとに管理者用に異なるログ ファイルを作成する場合は、次のようなことを試してください。ロガー プロバイダーからメイン コードで常にロガーを取得します。

Logger auditLogger = AuditLogger.getLogger(username,sessionID);
//you can get the audit logger instance in any class using the above code.
//use this logger to write the change-log.

これは、Audit Logger 実装のスケルトンです。より多くの条件付きチェックを使用して、セッションの個別のロガーを返すように拡張できます。

public AuditLogger {

public static Logger getLogger(String username,String sessionID)
{
   //get a logger from Log4j using name+sessionID, this may return a new logger if none found
   Logger userLogger = Logger.getLogger(name+sessionID);

   Appender appender = userLogger.getAppender(name+sessionID);
   If(appender != null)
    {
      //not a first call
      return userLogger;
    }
   else
   {
      //first call for the name+sessionID combination
      RollingFileAppender app = new RollingFileAppender();
      app.setName(name+sessionID);
      app.setFile(LOG_FOLDER +"/"+name+sessionID+".log";
      //.......(set all other options..)
      // set an html layout for better formatting.
      // write your own enhanced html layout which writes more details in formatted way.
      userLogger.addAppender(app);
      app.activateOptions();
      return userlogger;
   }

}    

これにより、セッションごとに 1 つの個別のログが作成されます。このログを使用して、1 つのセッションで変更ログを特定し、それを監査人にメールで送信できます。

セッションが破棄されたときに、アペンダーをクリーンアップすることをお勧めします (アペンダーを閉じると思います)。また、使用が終了したら、ロガーを無効にする可能性も確認できます。

于 2013-10-23T20:10:43.510 に答える
0

これを log4j やその他のロギング フレームワークで直接実行できるかどうかはわかりませんが、「監査」ログが必要なようです。

これを処理する方法は、監査が必要なメソッドに適用できるカスタム アノテーション @Audit を作成することでした。私たちの場合、ログ ファイルに書き込むのではなく、監査レコードを DB テーブルに保存しました。特定のログファイルに行を書き込むカスタム アペンダーを使用して、Log4J を使用する独自の注釈を簡単にセットアップできます。このような注釈は次のようになります。

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Audit {
  // Put any custom parameters here for your annotation
}

そして、それらの注釈を後で「読み取る」何らかの方法が必要です。次のような AOP を使用することにしました。

@Aspect
@Component("auditAdvice")
@Lazy(true)
@Order(999)
public class AuditAdvice {
  @Before(value = "@annotation(audit), argNames="audit")
  public void doAudit(JoinPoint aPoint, Audit audit) {
    // Write out audit to logger here
  }
}

この記事で説明されているように、反射を使用することもできます。

于 2013-10-23T14:02:15.190 に答える