【问题标题】:How to configure java.util.logging in groovy for class/method name?如何在 groovy 中为类/方法名配置 java.util.logging?
【发布时间】:2014-01-18 07:22:53
【问题描述】:

testlog.java:

import java.util.logging.Logger;
public class testlog {
    private final static Logger log = Logger.getLogger(testlog.class.getName());
    public static void main(String[] args) {
        System.setProperty("java.util.logging.SimpleFormatter.format","[%1$tF %1$tT]:%4$s:(%2$s): %5$s%n");
        log.info("logging test");
    }
}

执行:

$ java testlog
[2014-01-18 11:08:51]:INFO:(testlog main): logging test

testlog.groovy:

import java.util.logging.Logger;
public class testlog {
    private final static Logger log = Logger.getLogger("testlog");
    public static void main(String[] args) {
        System.setProperty("java.util.logging.SimpleFormatter.format",'[%1$tF %1$tT]:%4$s:(%2$s): %5$s%n');
        log.info("logging test");
    }
}

执行:

$ groovy testlog
[2014-01-18 11:11:23]:INFO:(java_util_logging_Logger$info call): logging test

如何为类/方法名配置 groovy 而不是“java_util_logging_Logger$info call”?

【问题讨论】:

  • 感谢您向我展示我需要的格式!

标签: logging groovy java.util.logging


【解决方案1】:

Groovy 通常在字节码中使用CallSite。上面提到的 Groovy 代码将编译为以下格式的字节码:

import groovy.lang.GroovyObject;
import groovy.lang.MetaClass;
import java.util.logging.Logger;
import org.codehaus.groovy.runtime.ScriptBytecodeAdapter;
import org.codehaus.groovy.runtime.callsite.CallSite;

public class testlog
  implements GroovyObject
{
  private static final Logger log;

  static
  {
    __$swapInit();long l1 = 0L;__timeStamp__239_neverHappen1390064566496 = l1;
      long l2 = 
        1390064566495L;__timeStamp = l2;
       Object localObject = 
        $getCallSiteArray()
           [2].call(Logger.class, "testlog");log = 
           (Logger)ScriptBytecodeAdapter.castToType(localObject, Logger.class);
  }

  public static void main(String... args)
  {
    CallSite[] arrayOfCallSite = 
      $getCallSiteArray();arrayOfCallSite[0].call(System.class, 
        "java.util.logging.SimpleFormatter.format", 
                  "[%1$tF %1$tT]:%4$s:(%2$s): %5$s%n");
    arrayOfCallSite[1].call(log, "logging test");
  }

  public testlog()
  {
    testlog this;
    CallSite[] arrayOfCallSite = $getCallSiteArray();
    MetaClass localMetaClass = $getStaticMetaClass();
    this.metaClass = localMetaClass;
  }
}

因此,当从格式化程序中引用时,它指的是 Log 类。要解决这个问题,您可以在类级别使用 CompileStatic 注释,它将源代码转换为普通 Java 约定中的字节码。

这是脚本的外观(注意:- 类名是 CamelCase):

import java.util.logging.Logger
import groovy.transform.CompileStatic

@CompileStatic
public class Testlog {
    private final static Logger log = Logger.getLogger("testlog")
    public static void main(String[] args) {
        System.setProperty("java.util.logging.SimpleFormatter.format",
            '[%1$tF %1$tT]:%4$s:(%2$s): %5$s%n')
        log.info("logging test")
    }
}

【讨论】:

  • 当然,它是这样工作的……但恕我直言,这太过分了。 @CompileStatic 对我不利。 Tnx,现在我明白它为什么会这样工作了,我会尝试编写自己的 Formatter。
  • 不,我从 Groovy 搬到了 Kotlin (kotlinlang.org)。对我来说最好的语言自动取款机。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-15
  • 2010-10-29
  • 2013-09-12
相关资源
最近更新 更多