[英]Lazy log message evaluation in java
在某些情況下,我有興趣推遲創建日志消息,因此在日志級別不足的情況下不會創建它。
我通過將回調傳遞給日志記錄函數來實現,如果日志記錄級別足夠,則會調用該函數。
問題是我無法傳遞一個不是最終的變量,因為Java有封閉限制。
什么是更干凈的方法呢?
運行代碼: http : //tpcg.io/IspNlN
import java.util.*;
import java.lang.*;
import java.io.*;
import java.util.function.Supplier;
public class StackOverflow
{
private static final int LOG_LEVEL=2;
private static final int TRACE_LEVEL=0;
private static void trace(Supplier<String> messageCallback){
if(TRACE_LEVEL>LOG_LEVEL) return;
System.out.println(messageCallback.get());
}
private static void foo(){
for(int i=0; i<10; i++){
doSomething();
int finalI=i; //I need it because of "Local variable parameterIndex defined in an enclosing scope must be final or effectively final"
trace(()->"FLOW-1: "+getHugeString()+" for i:"+finalI);
}
}
public static void main (String[] args) throws java.lang.Exception
{
foo();
}
private static void doSomething(){
//some operation
}
private static String getHugeString(){
return "A huge string that took much time to create";
}
}
您可以按優先順序提到三個選項。
選項1
使用正確的日志庫。
選項2由@Glains指出
private static boolean isTraceEnabled()
{
return TRACE_LEVEL <= LOG_LEVEL;
}
private static void trace(String msg)
{
if (isTraceEnabled())
{
System.out.println(msg);
}
}
private static void foo()
{
for (int i = 0; i < 10; i++)
{
doSomething();
if (isTraceEnabled())
{
trace("FLOW-1: " + getHugeString() + " for i:" + i);
}
}
}
選項3使用jdk logger中的消息格式。
private static void trace(String format, Object... values)
{
if (TRACE_LEVEL > LOG_LEVEL)
{
return;
}
for (int i = 0; i < values.length; i++)
{
Object value = values[i];
if (value instanceof Supplier)
{
values[i] = ((Supplier) value).get();
}
}
System.out.println(new MessageFormat(format).format(values));
}
調用就像
trace("FLOW-1: {0} for i: {1}", (Supplier) (StackOverflow::getHugeString), i);
常見的日志記錄框架提供了像isDebugEnabled
或isInfoEnabled
這樣的方法來完全防范字符串可能需要更長時間才能創建的情況。
if(LOG.isDebugEnabled()) {
LOG.debug("Some objects toString method called: {}", someObject.toString());
}
除此之外,您的方法也有效,但具有您已經指出的限制。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.