在Titan中记录Groovy脚本中的语法错误

时间:2016-11-05 12:33:07

标签: logging groovy titan gremlin gremlin-server

我正在开发一个使用图形数据库Titan的项目。查询通过Greovlin以Groovy脚本的形式从Python发送。我可以访问Titan / Gremlin日志,但是,日志提供的语法(和其他)错误信息非常少。如果脚本出现问题,大多数时候我只会收到包含语法错误的通知。在例子中(我故意留下关闭大括号):

graph.traversal().V(4096).hasLabel('slot_type').has('name', 'slot_DefTerm'

我刚收到一条消息:

WARN  org.apache.tinkerpop.gremlin.server.handler.HttpGremlinEndpointHandler  - Invalid request - responding with 500 Internal Server Error and Error encountered evaluating script: 

graph.traversal().V(4096).hasLabel('slot_type').has('name', 'slot_DefTerm'

缺少有关错误的行/列的信息(以及错误的描述)会导致调试非常缓慢和痛苦,尤其是大脚本和复杂错误。

我想在gremlin日志中提供更多信息,例如:从Groovy解释器记录语法错误消息。如何配置Titan以便以这种方式提供更多信息?

1 个答案:

答案 0 :(得分:1)

我不确定你是否只使用旧版本的Gremlin Server和Titan,但是从TinkerPop 3.2.3开始,你会在输出和服务器日志中得到相当强大的错误:

$ curl "http://localhost:8182?gremlin=100/0"
{"message":"Division by zero","Exception-Class":"java.lang.ArithmeticException"}
$ curl "http://localhost:8182?gremlin=x=100\nx/0"
{"message":"startup failed:\nScript4.groovy: 1: unexpected char: '\\' @ line 1, column 6.\n   x=100\\nx/0\n        ^\n\n1 error\n","Exception-Class":"org.codehaus.groovy.control.MultipleCompilationErrorsException"}

请注意,服务器输出也非常详细:

[WARN] HttpGremlinEndpointHandler - Invalid request - responding with 500 Internal Server Error and startup failed:
Script4.groovy: 1: unexpected char: '\' @ line 1, column 6.
   x=100\nx/0
        ^

1 error

org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
Script4.groovy: 1: unexpected char: '\' @ line 1, column 6.
   x=100\nx/0
        ^

1 error

    at org.codehaus.groovy.control.ErrorCollector.failIfErrors(ErrorCollector.java:310)
    at org.codehaus.groovy.control.ErrorCollector.addFatalError(ErrorCollector.java:150)
    at org.codehaus.groovy.control.ErrorCollector.addError(ErrorCollector.java:120)
    at org.codehaus.groovy.control.ErrorCollector.addError(ErrorCollector.java:132)
    at org.codehaus.groovy.control.SourceUnit.addError(SourceUnit.java:360)
    at org.codehaus.groovy.antlr.AntlrParserPlugin.transformCSTIntoAST(AntlrParserPlugin.java:140)
    at org.codehaus.groovy.antlr.AntlrParserPlugin.parseCST(AntlrParserPlugin.java:111)
    at org.codehaus.groovy.control.SourceUnit.parse(SourceUnit.java:237)
    at org.codehaus.groovy.control.CompilationUnit$1.call(CompilationUnit.java:167)
    at org.codehaus.groovy.control.CompilationUnit.applyToSourceUnits(CompilationUnit.java:931)
    at org.codehaus.groovy.control.CompilationUnit.doPhaseOperation(CompilationUnit.java:593)
    at org.codehaus.groovy.control.CompilationUnit.processPhaseOperations(CompilationUnit.java:569)
    at org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:546)
    at groovy.lang.GroovyClassLoader.doParseClass(GroovyClassLoader.java:298)
    at groovy.lang.GroovyClassLoader.parseClass(GroovyClassLoader.java:268)
    at groovy.lang.GroovyClassLoader.parseClass(GroovyClassLoader.java:254)
    at groovy.lang.GroovyClassLoader.parseClass(GroovyClassLoader.java:211)
    at org.apache.tinkerpop.gremlin.groovy.jsr223.GremlinGroovyScriptEngine.getScriptClass(GremlinGroovyScriptEngine.java:527)
    at org.apache.tinkerpop.gremlin.groovy.jsr223.GremlinGroovyScriptEngine.eval(GremlinGroovyScriptEngine.java:446)
    at javax.script.AbstractScriptEngine.eval(AbstractScriptEngine.java:233)
    at org.apache.tinkerpop.gremlin.groovy.engine.ScriptEngines.eval(ScriptEngines.java:119)
    at org.apache.tinkerpop.gremlin.groovy.engine.GremlinExecutor.lambda$eval$2(GremlinExecutor.java:287)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)

我怀疑这个问题在早期版本的TinkerPop中可能是一个问题,这些版本随Titan 1.0一起提供,并且早已得到改进。