在我的应用程序中,我有像员工,学生这样的用户..,这些用户只能访问某些模块,例如员工只能访问员工和学生模块,学生只能访问学生模块,但是有一个名为管理员的用户他可以访问所有模块. 我的要求是当管理员更改应用程序中的任何模块时,我必须存储原始数据并在 file.log 中更改数据(我正在使用 log4j、spring、hibernate)并且我将该文件从邮件发送给特定用户。
请帮我。
谢谢
在我的应用程序中,我有像员工,学生这样的用户..,这些用户只能访问某些模块,例如员工只能访问员工和学生模块,学生只能访问学生模块,但是有一个名为管理员的用户他可以访问所有模块. 我的要求是当管理员更改应用程序中的任何模块时,我必须存储原始数据并在 file.log 中更改数据(我正在使用 log4j、spring、hibernate)并且我将该文件从邮件发送给特定用户。
请帮我。
谢谢
我不知道您是否可以直接使用 log4j 或任何日志记录框架来执行此操作,但听起来您需要的是“审核”日志。
我们处理它的方式是创建一个自定义注释@Audit,我们可以将其应用于需要审计的方法。在我们的例子中,我们没有写入日志文件,而是将审计记录存储到数据库表中。您可以轻松设置自己的注释,该注释使用 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
}
}
您也可以使用反射,如本文所述。
好的,如果您想为每个会话为管理员创建不同的日志文件,请尝试这样的事情。始终从 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.
这是审计记录器实现的骨架。您可以使用更多条件检查对其进行增强,以便为会话返回不同的记录器。
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;
}
}
这会为每个会话创建一个不同的日志。您可以使用此日志来识别一个会话中的更改日志并将其邮寄给审核员。
当会话被破坏时,您可以更好地清理附加程序(我认为通过关闭附加程序)。并且您还可以看到在使用完后取消记录器的可能性。