Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.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_Exception_Logging_Properties_Message - Fatal编程技术网

在Java中创建日志或异常消息的最佳实践

在Java中创建日志或异常消息的最佳实践,java,exception,logging,properties,message,Java,Exception,Logging,Properties,Message,我在Java6中找到了这段代码 String mensajeExcluido = ArqSpringContext.getPropiedad("MENSAJE.EXCLUIDO"); LOG.warn("ERROR: Servicio: " + mensajeExcluido + ":" + someDTO.getProperty() + ",\tsomeValue:" + someDTO.getValue() + "'."); throw new Exception(mensa

我在Java6中找到了这段代码

String mensajeExcluido = ArqSpringContext.getPropiedad("MENSAJE.EXCLUIDO");
LOG.warn("ERROR: Servicio: " + mensajeExcluido + ":" + someDTO.getProperty() +
        ",\tsomeValue:" + someDTO.getValue() + "'.");
throw new Exception(mensajeExcluido);
此代码

String mensajeExcluido = ArqSpringContext.getPropiedad("REGLA.MENSAJE");
String mensajeWarn = "ALERTA: Otro Servicio: " + mensajeExcluido + ":" +
        someDTO.getProperty() + ",\tsomeValue:" + someDTO.getValue() + "'.";
LOG.warn(mensajeWarn);

boolean exclusionVisible = Boolean.valueOf(ArqSpringContext.getPropiedad("EXCLUSION.VISIBLE"));
if (exclusionVisible) {
    mensajeWarn = "<br></br>" + mensajeWarn;
} else {
    mensajeWarn = "";
}
throw new Exception(mensajeExcluido + mensajeWarn);
LOG.warn("No se pudo validar Client Service. Code: " +
        someDTO.getStatusCode() + ".");
return "No se pudo validar Client Service. Code: " +
        someDTO.getStatusCode() + ".";
为了遵循最佳实践

哪些建议适用?

他们会对代码做哪些更改?


文本应如何处理?

首先,在检查是否应打印日志语句之前,尽量避免进行消息创建处理(即:在检查日志级别之前,不要连接消息字符串)

//这样更好
if(LOG.isDebugEnabled())
debug(“这是一条内部带有“+变量+”的消息”);
//比这个
final String message=“这是一条内部带有“+变量+”的消息”;
if(LOG.isDebugEnabled())
LOG.debug(消息);
大多数Java日志框架都允许根据给定的设置预先检查是否要打印日志语句

如果您想省去为每个日志语句编写这些检查的负担,可以利用Java 8 lambdas并编写如下实用程序:


导入java.util.function.Supplier;
导入java.util.logging.Logger;
导入静态java.util.logging.Level.FINE;
类MyLogger{
的公共静态MyLogger(最终类loggerClass){
返回新的MyLogger(loggerClass);
}
私人最终记录器;
私人MyLogger(最终类loggerClass){
logger=logger.getLogger(loggerClass.getName());
}
//检查是否必须执行日志声明后,将对供应商进行评估
公共无效罚款(最终供应商信息){
if(记录器isLoggable(精细))
logger.log(很好,message.get().toString());
}
}
静态最终日志=MyLogger.of(String.class);
公共无效示例(){
LOG.fine(()->“这是一条带有系统属性的消息:“+system.getProperty(“property”)”);
}
最后,您可以利用Java字符串格式,使用
string.format
格式化日志消息。例如:

final String message=String.format(“打印%s字符串和%d位”,“str”,42);
适用于您提供的示例的良好实践包括:

/*
*在JDK8中使用java.util.logging+
*/
导入java.util.logging.Level;
导入java.util.logging.Logger;
导入静态java.lang.String.format;
类Dto{
字符串getProperty(){return“property”;}
字符串getValue(){return“property”;}
字符串getStatusCode(){返回“statusCode”;}
}
最终记录器日志=Logger.getGlobal();
最终Dto someDTO=新Dto();
void example1()引发异常{
字符串mensajeExcluido=System.getProperty(“MENSAJE.EXCLUIDO”);
//在编写日志消息之前,检查是否将打印日志
if(日志可隔离(级别警告)){
//使用String.format通常更清晰,并提供更多格式选项
最终字符串messageFormat=“错误:服务:%s:%s,\t部分值:%s”;
警告(格式(messageFormat,mensajeExcluido,someDTO.getProperty(),someDTO.getValue());
}
//或者使用lambdas
日志。警告(()->{
最终字符串消息=“错误:服务:%s:%s,\t部分值:%s”;
返回格式(message,mensajeExcluido,someDTO.getProperty(),someDTO.getValue());
});
抛出新异常(mensajeExcluido);
}
void example2()引发异常{
字符串mensajeExcluido=System.getProperty(“REGLA.MENSAJE”);
字符串mensajeWarn=格式(
//连接的消息可能在“someValue”处缺少一个引号
“ALERTA:Otro服务:%s:%s,\t某些值:%s”。”,
男子汉,
someDTO.getProperty(),
someDTO.getValue()
);
日志警告(mensajeWarn);
boolean exclusionVisible=boolean.parseBoolean(System.getProperty(“EXCLUSION.VISIBLE”);
字符串exceptionMessage=ExclutionVisible?
mensajeExcluido+“

”+mensajeExcluido:mensajeExcluido; 抛出新异常(exceptionMessage); } 字符串示例3(){ //您只能编写一次消息,并将其用于日志和结果 字符串消息= 格式(“无se pudo validar客户端服务。代码:%s.”,someDTO.getStatusCode()); 日志警告(消息); 返回消息; }
在回答这个问题之前,我正在阅读关于这方面的文章。因此,我用示例问了一些具体的问题,并用这些示例寻找具体的答案。请用示例回答。我将建议应用到您的代码示例中(每个示例都有自己的名为“exampleX”的方法)如果此答案适合您,请选择它作为接受答案:)谢谢您的回答谢谢!我很高兴这对你有帮助