Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java自定义记录器:日志记录标准或/和最佳实践_Java_Logging - Fatal编程技术网

Java自定义记录器:日志记录标准或/和最佳实践

Java自定义记录器:日志记录标准或/和最佳实践,java,logging,Java,Logging,我正在开发一个框架,我希望jar尽可能地轻量级和独立 所以我写了一个日志类: import java.util.Date; 导入java.util.Properties; 公共类记录器{ 专用静态最终记录器me=新记录器(); 私有静态布尔信息=false; 私有静态布尔调试=false; 私有静态布尔错误=false; 私有静态字符串className=null; 公共静态记录器getInstance(类clazz){ className=clazz.getCanonicalName(); 试

我正在开发一个框架,我希望jar尽可能地轻量级和独立

所以我写了一个日志类:

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
    )更糟糕

    • 您不喜欢java.util.logging.Logger吗?它包含在JDK中,您不需要其他任何东西

      为什么要重新发明轮子

      如果您使用javautil日志库,那么它已经在JDK中,因此您没有额外的代码可以提供


      否则,log4j肯定很好。

      使用log4j。它不是一个重量级的日志框架,您所说的“尽可能独立”是什么意思?

      只需将log4jjar添加到您的框架中,就可以了。

      没有什么比使用更轻的了,因为它已经在JRE中提供了。

      我强烈建议您使用slf4j作为日志API,因为它的设计目的是能够在部署时切换后端。换言之,如果您的日志框架已经无法满足您的需求,或者必须使用其他东西与其他人进行交互,那么很容易改变您的想法

      它还允许您使用{}构造在日志字符串中轻松插入对象,而不需要额外的开销,前提是该字符串实际上没有被记录(这非常好)

      我建议你考虑把“简单”的后端适应你的需要,因为它可能提供你想要的90%。


      注意:不要直接使用任何后端(如log4j或java.util.logging),因为它实际上会将代码锁定到该后端。使用门面。

      我同意其他意见-使用COTS工具(Logger、Log4j或其他工具)。写和维护你自己的(通常)是不值得的


      还有一点需要考虑:如果您的框架包含您希望集成到一个日志文件中的其他第三方软件,则必须使用一些共享工具(例如,该第三方软件支持的工具)。让系统的所有部分将日志合并到一个位置通常非常有用。

      您会问三个问题:

      • 使此日志记录更好的最佳实践是什么
      正如其他人所指出的,最好的做法是用log4j或slf4j之类的东西完全替换它,或者,为了实现“独立性”目标,只需使用java.util.Logger即可

      • 制作自己的记录器是否值得
      不,除非在非常特殊的情况下,由于某种原因,现有的框架不能满足您的需要。你没有说任何话表明可能是这样的

      • 使用这个记录器会比选择现有的东西(比如log4j)更糟糕吗

      是的,如果没有其他原因,那么当其他维护人员进入您的代码库时,他们会花几分钟阅读您的日志类。使用现有框架意味着他们已经知道它的功能。

      考虑到诸如java.util.log*或log4j之类的日志框架具有很好的可扩展性和可配置性,通过facade(令人钦佩的是一个非常好的facade)真的值得吗。您是否遇到过log4j无法满足的需求?slf4j提供了{}构造。仅此一点就足以保证在任何地方都可以使用。感谢您的推荐,但对于java.util.logging.Logger,我不需要额外的导入。10年后的今天,我认为slf4j(作为logback的API)背后的设计被打破了,日志不应该是应用程序中看不见的部分,而应该是一个一流的组件。对于一个新项目,我建议查看log4j版本2并使用本机API。明智的建议。我已经记不清有多少次我看到人们写他们自己的框架(通常很好),但是当他们开始记录他们的时候,他们就失去了兴趣。很好的答案。但我有一个后续问题。我们的产品有5种不同的微服务。我们正在为此开发一个公共库,以处理交叉关注点。可以使用哪些常见的日志功能