如何为每个会话创建.log文件以及如何将该特定会话数据存储在.log文件中?

时间:2013-07-02 10:41:11

标签: hibernate spring-mvc log4j

在我的应用程序中,我有用户喜欢的工作人员,学生..,这些用户只能访问一些模块,如员工只能访问员工和学生模块,学生只能访问学生模块,但有用户名为Admin他可以访问所有模块。我的要求是当管理员更改应用程序中的任何模块然后我必须存储原始数据并在file.log中更改数据(我正在使用log4j,spring,hibernate)并且我将该文件从邮件发送给特定用户。

请帮帮我。

谢谢

2 个答案:

答案 0 :(得分:0)

我不知道您是否可以直接使用log4j或任何日志记录框架执行此操作,但听起来您需要的是“审核”日志。

我们处理它的方式是创建一个自定义注释@Audit,我们可以将其应用于需要审核的方法。在我们的例子中,我们没有写入日志文件,而是将审计记录存储到数据库表中。您可以轻松地设置自己的注释,该注释使用Log4J和自定义appender,后者将行写入特定的日志文件。这样的注释可能如下所示:

@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
  }
}

你也可以使用Reflections作为this article explains

答案 1 :(得分:0)

好的,如果你想为每个会话创建不同的管理员日志文件,试试这样的事情。 始终从Logger Provider获取主代码中的Logger。

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;
   }

}    

这会为每个会话创建一个不同的日志。您可以使用此日志在一个会话中标识更改日志,并将其邮寄给审核员。

当会话被破坏时,你可以更好地清理appender(我认为通过关闭appender)。一旦完成使用,您还可以看到取消记录器的可能性。