《Log4j 2 官方文档》Scripts
Log4j支持符合JSR223的腳本語(yǔ)言使用在它的組件上。任何一種支持符合JSR223標(biāo)準(zhǔn)的語(yǔ)言引擎都可以使用。所有的語(yǔ)言列表可以在JSR223腳本引擎的頁(yè)面中找到。很多語(yǔ)言被列在這里,例如javaScript,Groovy,BeanShell,直接支持JSR223語(yǔ)言框架,只要引入了jar就可以支持選擇的語(yǔ)言了。Log4j通過(guò)<script>,<scriptFile>和<scriptRef>這三個(gè)元素標(biāo)簽來(lái)支持腳本語(yǔ)言的使用。Script元素包含了腳本的名稱,腳本編寫(xiě)的語(yǔ)言,以及腳本的內(nèi)容。
scriptFile包含了腳本的名稱,和這個(gè)腳本所在的位置,語(yǔ)言,字符集,是否對(duì)腳本的變化進(jìn)行監(jiān)視。
scriptRef包含了在script元素定義的腳本名稱。
腳本的名稱通常用來(lái)存儲(chǔ)腳本,并且和他的腳本引擎在一起,因此每次腳本需要運(yùn)行的時(shí)候都可以被快速定位。然而腳本的名字不是必須的,提供名字方便在運(yùn)行的時(shí)候有助于調(diào)試。在script元素中必須指定腳本語(yǔ)言(language屬性),而且這些語(yǔ)言必須是在配置列表中的語(yǔ)言。如果腳本語(yǔ)言沒(méi)有在scriptFile元素上指定,那么通過(guò)腳本的擴(kuò)展名來(lái)識(shí)別腳本語(yǔ)言。如果腳本文件監(jiān)控需要執(zhí)行,那么必須在configuration元素中設(shè)置monitorInterval為非0的值。間隔interval時(shí)長(zhǎng),系統(tǒng)將會(huì)檢測(cè)腳本文件的變化。
<?xml version="1.0" encoding="UTF-8"?> <Configuration status="debug" name="RoutingTest"><Scripts><Script name="selector" language="javascript"><![CDATA[var result;if (logEvent.getLoggerName().equals("JavascriptNoLocation")) {result = "NoLocation";} else if (logEvent.getMarker() != null && logEvent.getMarker().isInstanceOf("FLOW")) {result = "Flow";}result;]]></Script><ScriptFile name="groovy.filter" path="scripts/filter.groovy"/></Scripts><Appenders><Console name="STDOUT"><ScriptPatternSelector defaultPattern="%d %p %m%n"><ScriptRef ref="selector"/><PatternMatch key="NoLocation" pattern="[%-5level] %c{1.} %msg%n"/><PatternMatch key="Flow" pattern="[%-5level] %c{1.} ====== %C{1.}.%M:%L %msg ======%n"/></ScriptPatternSelector><PatternLayout pattern="%m%n"/></Console></Appenders><Loggers><Logger name="EventLogger" level="info" additivity="false"><ScriptFilter onMatch="ACCEPT" onMisMatch="DENY"><Script name="GroovyFilter" language="groovy"><![CDATA[if (logEvent.getMarker() != null && logEvent.getMarker().isInstanceOf("FLOW")) {return true;} else if (logEvent.getContextMap().containsKey("UserId")) {return true;}return false;]]></Script></ScriptFilter><AppenderRef ref="STDOUT"/></Logger><Root level="error"><ScriptFilter onMatch="ACCEPT" onMisMatch="DENY"><ScriptRef ref="groovy.filter"/></ScriptFilter><AppenderRef ref="STDOUT"/></Root></Loggers></Configuration>如果Configuration元素設(shè)置status為DEBUG,那么啟動(dòng)的時(shí)候當(dāng)前安裝的腳本引擎以及腳本的信息,將會(huì)在輸出日志中逐條顯示出來(lái)。
盡管有些引擎不是線程安全的,但是Log4j會(huì)確保他們?cè)诰€程安全的模式下運(yùn)行。
2015-09-27 16:13:22,925 main DEBUG Installed script engines 2015-09-27 16:13:22,963 main DEBUG AppleScriptEngine Version: 1.1, Language: AppleScript, Threading: Not Thread Safe,Compile: false, Names: {AppleScriptEngine, AppleScript, OSA} 2015-09-27 16:13:22,983 main DEBUG Groovy Scripting Engine Version: 2.0, Language: Groovy, Threading: MULTITHREADED,Compile: true, Names: {groovy, Groovy} 2015-09-27 16:13:23,030 main DEBUG BeanShell Engine Version: 1.0, Language: BeanShell, Threading: MULTITHREADED,Compile: true, Names: {beanshell, bsh, java} 2015-09-27 16:13:23,039 main DEBUG Mozilla Rhino Version: 1.7 release 3 PRERELEASE, Language: ECMAScript, Threading: MULTITHREADED,Compile: true, Names: {js, rhino, JavaScript, javascript, ECMAScript, ecmascript}當(dāng)腳本被執(zhí)行,他們會(huì)提供一系列的變量,這些變量保證完成 各種他們期望執(zhí)行的各種任務(wù)。腳本可用變量的列表,可以查看每個(gè)組件的相關(guān)文檔。
組件期望腳本的返回值傳遞給Java代碼。對(duì)于大多數(shù)腳本語(yǔ)言都不是問(wèn)題,但是JavaScript不允許返回,除非是在一個(gè)fuction里。
然后JavaScript將腳本中的最后一個(gè)表達(dá)式返回。
如下的代碼就是我們期望的結(jié)果(result被返回)。
var result;if (logEvent.getLoggerName().equals("JavascriptNoLocation")) {result = "NoLocation";} else if (logEvent.getMarker() != null && logEvent.getMarker().isInstanceOf("FLOW")) {result = "Flow";}result;Beanshell 備注
JSR 223?腳本引擎規(guī)定如果引擎支持編譯他們的腳本,需要識(shí)別他們支持的編譯接口。Beanshell就有這樣的特點(diǎn)。
然后無(wú)論什么情況編譯方法只要被調(diào)用就會(huì)報(bào)一個(gè)錯(cuò)誤(不是異常)
Log4j捕獲了這個(gè)錯(cuò)誤,并且將這個(gè)錯(cuò)誤打印了出來(lái)。所有的BeanShell腳本在每次執(zhí)行的時(shí)候才進(jìn)行解釋(解釋執(zhí)行)。
2015-09-27 16:13:23,095 main DEBUG Script BeanShellSelector is compilable 2015-09-27 16:13:23,096 main WARN Error compiling script java.lang.Error: unimplementedat bsh.engine.BshScriptEngine.compile(BshScriptEngine.java:175)at bsh.engine.BshScriptEngine.compile(BshScriptEngine.java:154)at org.apache.logging.log4j.core.script.ScriptManager$MainScriptRunner.<init>(ScriptManager.java:125)at org.apache.logging.log4j.core.script.ScriptManager.addScript(ScriptManager.java:94)?
?
轉(zhuǎn)載自?并發(fā)編程網(wǎng) - ifeve.com
總結(jié)
以上是生活随笔為你收集整理的《Log4j 2 官方文档》Scripts的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 一文告诉你,大数据在智慧医疗领域发挥的作
- 下一篇: 《Ansible权威指南》一1.7 An