Java自定义记录器:日志记录标准或/和最佳实践
我正在开发一个框架,我希望jar尽可能地轻量级和独立 所以我写了一个日志类:Java自定义记录器:日志记录标准或/和最佳实践,java,logging,Java,Logging,我正在开发一个框架,我希望jar尽可能地轻量级和独立 所以我写了一个日志类: import java.util.Date; 导入java.util.Properties; 公共类记录器{ 专用静态最终记录器me=新记录器(); 私有静态布尔信息=false; 私有静态布尔调试=false; 私有静态布尔错误=false; 私有静态字符串className=null; 公共静态记录器getInstance(类clazz){ className=clazz.getCanonicalName(); 试
import java.util.Date;
导入java.util.Properties;
公共类记录器{
专用静态最终记录器me=新记录器();
私有静态布尔信息=false;
私有静态布尔调试=false;
私有静态布尔错误=false;
私有静态字符串className=null;
公共静态记录器getInstance(类clazz){
className=clazz.getCanonicalName();
试一试{
Properties props=new CustProps().load(clazz);
if(props.get(CustProps.NAME\u LOG\u MODE)!=null){
字符串devMode=props.getProperty(CustProps.NAME\u LOG\u模式)
.toLowerCase();
if(“info”.equals(devMode)){
信息=真;
debug=true;
}else if(“debug”.equals(devMode)){
debug=true;
}
}
}捕获(例外e){
//默认情况下,调试是错误的
}
错误=真;
还我;
}
公共无效日志错误(对象消息){
if(isError()){
System.out.println(新日期().toString())
+“错误[“+Logger.className+”]-“+msg);
}
}
公共无效日志调试(对象消息){
if(isDebug()){
System.out.println(新日期().toString())
+“调试[”+Logger.className+“]-”+msg);
}
}
公共无效登录信息(对象消息){
if(isInfo()){
System.out.println(新日期().toString())
+“INFO[”+Logger.className+“]-”+msg);
}
}
公共布尔值isInfo(){return Logger.info;}
公共布尔值isDebug(){return Logger.debug;}
公共布尔isError(){return Logger.error;}
}
- 使日志记录更好的最佳实践是什么李>
- 制作自己的记录器是否值得
- 使用此记录器是否会使我的框架比选择现有的东西(如
)更糟糕log4j
- 使此日志记录更好的最佳实践是什么
- 制作自己的记录器是否值得李>
- 使用这个记录器会比选择现有的东西(比如log4j)更糟糕吗
- 您不喜欢java.util.logging.Logger吗?它包含在JDK中,您不需要其他任何东西 为什么要重新发明轮子
如果您使用javautil日志库,那么它已经在JDK中,因此您没有额外的代码可以提供
否则,log4j肯定很好。使用log4j。它不是一个重量级的日志框架,您所说的“尽可能独立”是什么意思?
只需将log4jjar添加到您的框架中,就可以了。没有什么比使用更轻的了,因为它已经在JRE中提供了。我强烈建议您使用slf4j作为日志API,因为它的设计目的是能够在部署时切换后端。换言之,如果您的日志框架已经无法满足您的需求,或者必须使用其他东西与其他人进行交互,那么很容易改变您的想法 它还允许您使用{}构造在日志字符串中轻松插入对象,而不需要额外的开销,前提是该字符串实际上没有被记录(这非常好) 我建议你考虑把“简单”的后端适应你的需要,因为它可能提供你想要的90%。
注意:不要直接使用任何后端(如log4j或java.util.logging),因为它实际上会将代码锁定到该后端。使用门面。我同意其他意见-使用COTS工具(Logger、Log4j或其他工具)。写和维护你自己的(通常)是不值得的
还有一点需要考虑:如果您的框架包含您希望集成到一个日志文件中的其他第三方软件,则必须使用一些共享工具(例如,该第三方软件支持的工具)。让系统的所有部分将日志合并到一个位置通常非常有用。您会问三个问题:
是的,如果没有其他原因,那么当其他维护人员进入您的代码库时,他们会花几分钟阅读您的日志类。使用现有框架意味着他们已经知道它的功能。考虑到诸如java.util.log*或log4j之类的日志框架具有很好的可扩展性和可配置性,通过facade(令人钦佩的是一个非常好的facade)真的值得吗。您是否遇到过log4j无法满足的需求?slf4j提供了{}构造。仅此一点就足以保证在任何地方都可以使用。感谢您的推荐,但对于java.util.logging.Logger,我不需要额外的导入。10年后的今天,我认为slf4j(作为logback的API)背后的设计被打破了,日志不应该是应用程序中看不见的部分,而应该是一个一流的组件。对于一个新项目,我建议查看log4j版本2并使用本机API。明智的建议。我已经记不清有多少次我看到人们写他们自己的框架(通常很好),但是当他们开始记录他们的时候,他们就失去了兴趣。很好的答案。但我有一个后续问题。我们的产品有5种不同的微服务。我们正在为此开发一个公共库,以处理交叉关注点。可以使用哪些常见的日志功能