在 Titan 中记录 Groovy 脚本中的语法错误
Logging syntax errors in Groovy scripts in Titan
我正在从事一个使用图数据库 Titan 的项目。查询以 Groovy 脚本的形式从 Python 通过 Gremlin 发送。我可以访问 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'
缺少有关 line/column 错误的信息(以及错误的描述)会导致非常缓慢和痛苦的调试,尤其是大脚本和复杂的错误。
我想在 gremlin 日志中提供更多信息,例如记录来自 Groovy 解释器的语法错误消息。我如何配置 Titan 以通过这种方式使日志记录提供更多信息?
我不确定您是否只是将旧版本的 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.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(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)
我怀疑这个问题可能是 Titan 1.0 附带的早期版本的 TinkerPop 的问题,并且早已得到改进。
我正在从事一个使用图数据库 Titan 的项目。查询以 Groovy 脚本的形式从 Python 通过 Gremlin 发送。我可以访问 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'
缺少有关 line/column 错误的信息(以及错误的描述)会导致非常缓慢和痛苦的调试,尤其是大脚本和复杂的错误。
我想在 gremlin 日志中提供更多信息,例如记录来自 Groovy 解释器的语法错误消息。我如何配置 Titan 以通过这种方式使日志记录提供更多信息?
我不确定您是否只是将旧版本的 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.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(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)
我怀疑这个问题可能是 Titan 1.0 附带的早期版本的 TinkerPop 的问题,并且早已得到改进。