gpt4 book ai didi

java - Java 中的惰性日志消息评估

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:47:10 25 4
gpt4 key购买 nike

在某些情况下,我有兴趣推迟日志消息的创建,因此在日志级别不够的情况下不会创建它。

我通过将回调传递给日志记录函数来实现,如果日志记录级别足够则调用该函数。

问题是我不能传递一个不是最终有效的变量,因为 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

使用适当的日志记录库。

@Glains 指出的选项 2

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 记录器中的消息格式。

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);

关于java - Java 中的惰性日志消息评估,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51132381/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com