我正试图操纵一只野生动物10.1。 standalone.xml
通过gradle buildscript修改记录器设置。我以前做过这个,并且使用记录器条目,这可以按预期工作。但是,现在我需要添加一个新的periodic-rotating-file-handler
,它本身不是问题,但在尝试告诉实际登录的文件时它会起作用。
现有代码:
def configFile = {wildflyDir}/standalone/configuration/standalone.xml"
def xml = new XmlSlurper(false,false).parse(configFile)
def logging = xml.profile.subsystem.find{ it['@xmlns'] == "urn:jboss:domain:logging:3.0' }
logging.appendNode {
logger(category:"loggingCategory") {
level(name:"LEVEL")
}
}
正如所料,这是非常实用的。现在我需要添加一个这样的代码段:
<periodic-rotating-file-handler>
<formatter>
<named-formatter name="PATTERN" />
</formatter>
<file path="file.log" relative-to="jboss.logging.dir" />
<suffix value=".yyyy-MM-dd" />
<append value="true" />
</periodic-rotating-file-handler>
file
定义中存在问题,因为build.gradle
文件中的问题如下所示:
file(path:"file.log" "relative-to":"jboss.logging.dir")
这被Gradle解释为new File(arg1, arg2)
,所以基本上它试图将带有给定参数的文件对象添加到XML中。
这是有效的,但绝对不是我想要的,因为我只需要相应的XML节点。我试图以多种方式逃避:
file
,使其成为斜线和美元字符串 - &gt;试图创建一个File对象我尝试了更多的东西,但由于沮丧,我无法回想起它们。
我最后的尝试是尝试向XML添加一个空file
节点,但是当使用file()
gradle时,不知道要使用哪个File-constructor,以及何时使用{{1我收到了一个错误:file
如果有人知道如何正确转义Namespace prefix: file is not bound to a URI
或有另一种方法将所述file
- 节点添加到XML,请告诉我。
谢谢。
答案 0 :(得分:2)
(1)委托上的调用构建器函数:
//just declare `file` to emulate problem in usual groovy console
def file={String a, String b-> println "file: a=$a, b=$b"}
def xml = new XmlSlurper(false,false).parseText('''
<root>
<profile>
<subsystem xmlns="urn:jboss:domain:logging:3.0"/>
</profile>
</root>''')
def logging = xml.profile.subsystem.find{ it['@xmlns'] == "urn:jboss:domain:logging:3.0" }
logging.plus{
logger(category:"loggingCategory") {
level(name:"LEVEL")
}
//be specific that you want to call file function on delegate and not on owner (by default)
delegate.'file'(path:"file.log", "relative-to":"jboss.logging.dir")
//or this also works:
"${'file'}"(path:"file.log", "relative-to":"jboss.logging.dir")
}
println groovy.xml.XmlUtil.serialize(xml)
(2)使用XmlParser解决方法:
使用current
作为当前父节点的访问者
def xml = new XmlParser(false,false).parseText('''
<root>
<profile>
<subsystem xmlns="urn:jboss:domain:logging:3.0"/>
</profile>
</root>''')
def logging = xml.profile.subsystem.find{ it['@xmlns'] == "urn:jboss:domain:logging:3.0" }
logging.plus{
logger(category:"loggingCategory") {
level(name:"LEVEL")
}
current.appendNode("file", [path:"file.log", "relative-to":"jboss.logging.dir"])
}
println groovy.xml.XmlUtil.serialize(xml)