《Log4j 2 官方文檔》Scripts
Log4j
支持符合JSR223的腳本語言使用在它的組件上。任何一種支持符合JSR223
標準的語言引擎都可以使用。所有的語言列表可以在JSR223
腳本引擎的頁麵中找到。很多語言被列在這裏,例如javaScript
,Groovy
,BeanShell
,直接支持JSR223
語言框架,隻要引入了jar就可以支持選擇的語言了。Log4j
通過<script>
,<scriptFile>
和<scriptRef>
這三個元素標簽來支持腳本語言的使用。Script
元素包含了腳本的名稱,腳本編寫的語言,以及腳本的內容。
scriptFile
包含了腳本的名稱,和這個腳本所在的位置,語言,字符集,是否對腳本的變化進行監視。
scriptRef
包含了在script元素定義的腳本名稱。
腳本的名稱通常用來存儲腳本,並且和他的腳本引擎在一起,因此每次腳本需要運行的時候都可以被快速定位。然而腳本的名字不是必須的,提供名字方便在運行的時候有助於調試。在script
元素中必須指定腳本語言(language屬性),而且這些語言必須是在配置列表中的語言。如果腳本語言沒有在scriptFile
元素上指定,那麼通過腳本的擴展名來識別腳本語言。如果腳本文件監控需要執行,那麼必須在configuration
元素中設置monitorInterval
為非0的值。間隔interval
時長,係統將會檢測腳本文件的變化。
<?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
元素設置status
為DEBUG
,那麼啟動的時候當前安裝的腳本引擎以及腳本的信息,將會在輸出日誌中逐條顯示出來。
盡管有些引擎不是線程安全的,但是Log4j
會確保他們在線程安全的模式下運行。
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}
當腳本被執行,他們會提供一係列的變量,這些變量保證完成 各種他們期望執行的各種任務。腳本可用變量的列表,可以查看每個組件的相關文檔。
組件期望腳本的返回值傳遞給Java代碼。對於大多數腳本語言都不是問題,但是JavaScript不允許返回,除非是在一個fuction裏。
然後JavaScript
將腳本中的最後一個表達式返回。
如下的代碼就是我們期望的結果(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
腳本引擎規定如果引擎支持編譯他們的腳本,需要識別他們支持的編譯接口。Beanshell
就有這樣的特點。
然後無論什麼情況編譯方法隻要被調用就會報一個錯誤(不是異常)
Log4j
捕獲了這個錯誤,並且將這個錯誤打印了出來。所有的BeanShell
腳本在每次執行的時候才進行解釋(解釋執行)。
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: unimplemented
at 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)
最後更新:2017-05-19 10:25:08
上一篇:
Mysql Connector 5.1 好用的新特性
下一篇:
《OSGI官方指南》翻譯邀請
hibernate的session判斷-openSession和getCurrentSession
禁止視頻網站使用Flash P2P上傳
SPI FLASH與NOR FLASH的區別?
《HttpClient 官方文檔》第三章 HTTP 狀態管理
關於翻譯《CSS - The Missing Manual》術語表的討論與建議
isdigit <ctype.h> <cctype>
基於MYSQL、R語言、SHINY的中型企業電子商務中心業務分析周報係統
obj-c編程10:Foundation庫中類的使用(6)[線程和操作隊列]
Spark SQL 物理執行計劃各操作實現
全新阿裏雲大學發布