如何在groovy中为类/方法名配置java.util.logging? [英] How to configure java.util.logging in groovy for class/method name?

查看:131
本文介绍了如何在groovy中为类/方法名配置java.util.logging?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

testlog.java:

  import java.util.logging.Logger; 
public class testlog {
private final 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);


code

$ b

执行:

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


code

$ b

执行:

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

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

解决方案

Groovy使用 CallSite 。上面提到的Groovy代码会编译为字节码格式:

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

公共类testlog
实现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 。类);
}

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;




$ b $ p $所以它指的是从格式器引用时记录类。要解决此问题,您可以使用 CompileStatic

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

  import java.util.logging.Logger 
导入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)
}
}


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

execute:

$ 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");
    }
}

execute:

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

How to configure groovy for class/method name instead of "java_util_logging_Logger$info call" ?

解决方案

Groovy uses CallSite in bytecode, generally. Groovy code mentioned above would compile to below format of bytecode:

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

So it refers to the Log class when referred from the formatter. To work around with this you can use CompileStatic annotation on class level which converts source to bytecode in normal Java convention.

Here is how the script should look (Note:- Class name is 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")
    }
}

这篇关于如何在groovy中为类/方法名配置java.util.logging?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆