Logging 标准化企业产品中的日志记录

Logging 标准化企业产品中的日志记录,logging,log4j,aop,slf4j,Logging,Log4j,Aop,Slf4j,我使用的软件具有高度不一致的日志记录。所有日志记录都在一个文件中完成,该文件包含来自不同模块和客户端交互的日志记录详细信息。日志文件非常混乱,我最不想做的就是在行首预先添加一些模块信息。例如,如下图所示,我希望日志在开头打印模块 #|2014-07-02T13:01:51.030+0530|INFO|glassfish3.1.1|javax.enterprise.system.std.com.sun.enterprise.server.logging|_ThreadID=104;_ThreadN

我使用的软件具有高度不一致的日志记录。所有日志记录都在一个文件中完成,该文件包含来自不同模块和客户端交互的日志记录详细信息。日志文件非常混乱,我最不想做的就是在行首预先添加一些模块信息。例如,如下图所示,我希望日志在开头打印模块

#|2014-07-02T13:01:51.030+0530|INFO|glassfish3.1.1|javax.enterprise.system.std.com.sun.enterprise.server.logging|_ThreadID=104;_ThreadName=Thread-3;|3131149 [pool-23-thread-18] [rid=1112 session=f5fc97b0ac1802b000b94819c9518996 user=TTUser13] INFO **[MODULE1]**  com.xxxxx.Manager  - Client manager - getMo(Test) request received |#]

[#|2014-07-02T13:01:51.033+0530|INFO|glassfish3.1.1|javax.enterprise.system.std.com.sun.enterprise.server.logging|_ThreadID=104;_ThreadName=Thread-3;|3131153 [pool-23-thread-18] [rid=1112 session=f5fc97b0ac1802b000b94819c9518996 user=TTUser13] INFO **[MODULE2]** com.xxxxx.server.CliRmiService  - getMo(f5fc97b0ac1802b000b94819c9518996) - 3ms - com.xxxxx.ManagerObject@10f7afd

我关于跨模块单独登录的建议遭到了很多怀疑(不允许)。因此,我至少希望能够在每行的开头添加模块信息。我在软件中使用SPRING、JAVA和log4j(slf4j包装器)。有没有更简单的方法?我不想转到每个记录器语句并添加该标题。那将非常不方便。另外,还有其他方法可以解决这个问题吗?

解决这个问题的最佳方法是重构代码并引入所需的日志记录。仅仅因为人们希望避免接触遗留代码而表示怀疑的点头是一种气味,而不是争论

现在,回答您的问题:尽管AOP不是为了修补糟糕的设计或不良的日志记录习惯而发明的,但您可以使用AspectJ来达到您的目的。像Spring AOP这样的“AOP lite”框架在这里是不合适的,因为Spring AOP只支持方法执行拦截,而不支持方法调用拦截,这正是您在这里需要的

下面是一个简单的AspectJ示例。请注意,每当我说“module”时,我指的是包名的最后一部分(在最后一个“.”之后),例如,如果包名是de.scrum_master.module1,则
module1
将是模块名

不同模块中的两个示例类:

package de.scrum\u master.module1;
导入java.util.logging.Logger;
公共阶层人士{
私有字符串名;
私有字符串lastName;
公众人物(String firstName,String lastName){this.firstName=firstName;this.lastName=lastName;}
@重写公共字符串toString(){return“Person[“+firstName+”“+lastName+”];}
public void doSomething(){Logger.getLogger(“GLOBAL”).info(“用“+this”做某事);}
public void doSomethingElse(){Logger.getLogger(“GLOBAL”).info(“使用“+this”)做其他事情;}
}
package de.scrum\u master.module2;
导入java.util.logging.Logger;
公共课场所{
私人国家;
私人城市;
公共场所(字符串国家,字符串城市){this.country=country;this.city=city;}
@重写公共字符串toString(){return“Place[“+city+”,“+country+”];}
public void doSomething(){Logger.getLogger(“GLOBAL”).info(“用“+this”做某事);}
public void doSomethingElse(){Logger.getLogger(“GLOBAL”).info(“使用“+this”)做其他事情;}
}
使用模块的驱动程序应用程序:

package de.scrum\u master.app;
导入java.util.logging.Logger;
导入de.scrum_master.module1.Person;
导入de.scrum_master.module2.Place;
公共类应用程序{
私有静态最终记录器LOG=Logger.getLogger(“全局”);
公共静态void main(字符串[]args){
dopersonstaff();
doPlaceStuff();
}
私有静态void doPersonStuff(){
LOG.info(“开始做个人事情…”);
个人=新人(“阿尔伯特”、“爱因斯坦”);
person.doSomething();
person.doSomethingElse();
人员=新人员(“沃纳”、“海森堡”);
person.doSomething();
person.doSomethingElse();
LOG.info(“完成个人工作”);
}
私有静态void doPlaceStuff(){
LOG.info(“开始做地方工作…”);
地点=新地点(“印度尼西亚”、“雅加达”);
地点:doSomething();
place.doSomethingElse();
地点=新地点(“德国”、“柏林”);
地点:doSomething();
place.doSomethingElse();
LOG.info(“完成地方工作”);
}
}
方面:

该特性在每个日志消息中预先添加一个大写的模块名称前缀,如
[MODULE1]
。相反,根据类或包名将方面记录到不同的日志文件中是非常简单的。这只是一个示范

package de.scrum\u master.aspect;
导入java.util.logging.Logger;
公共方面LogModuleReplender{
周围无效(字符串消息):
调用(公共无效记录器。*(字符串))&&args(消息)
{
字符串packageName=thisJoinPoint.getSourceLocation().getWithinType().getPackage().getName();
字符串moduleName=packageName.replaceFirst(“.[.]”,“”)。toUpperCase();
继续(“[”+moduleName+“]”+消息);
}
}
日志输出:

请注意,为了简单起见,在编写这个小示例时,我使用了Java日志记录而不是Log4j。它应该很容易适应

2014年7月25日上午11:11:48 de.scrum_master.app.Application info_aroundBody0
信息:[应用程序]开始做个人事情。。。
2014年7月25日上午11:11:48 de.scrum_master.module1.Person info_aroundBody0
信息:[模块1]与人做某事[Albert Einstein]
2014年7月25日上午11:11:48 de.scrum_master.module1.Person info_ound body 2
信息:[模块1]与人做其他事情[Albert Einstein]
2014年7月25日上午11:11:48 de.scrum_master.module1.Person info_aroundBody0
信息:[模块1]与人做某事[Werner Heisenberg]
2014年7月25日上午11:11:48 de.scrum_master.module1.Person info_ound body 2
信息:[模块1]与人做其他事情[Werner Heisenberg]
2014年7月25日上午11:11:48 de.scrum_master.app.Application info_aroundbody 2
信息:[应用程序]已完成个人操作
2014年7月25日上午11:11:48 de.scrum_master.app.Application info_aroundbody 4
信息:[应用程序]开始做地点s