《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元素设置statusDEBUG,那么启动的时候当前安装的脚本引擎以及脚本的信息,将会在输出日志中逐条显示出来。

尽管有些引擎不是线程安全的,但是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)

 

 

转载自 并发编程网 - ifeve.com

时间: 2024-08-01 11:13:45

《Log4j 2 官方文档》Scripts的相关文章

《Log4j 2 官方文档》多余性(Additivity)

如果我们希望输出com.foo.Bar的TRACE等级的日志,而不像影响其他日志的输出.简单的改变日志等级是不能达到我们想要的目的:但是修改也很简单,只要我们添加一个新的Logger定义就可以达到目标. <Logger name="com.foo.Bar" level="TRACE"/> <Root level="ERROR"> <AppenderRef ref="STDOUT"> <

《Log4j 2官方文档》 Configuration Syntax

配置语法 正如之前的例子所展示的一样,Log4j允许你简单地重新定义记录日志的行为而不需要去修改你的应用.可以禁用应用程序的某些部分的日志记录,只在满足特定标准时记录日志,例如为特定用户执行的操作,路由输出到Flume或者日志系统.要想实现这些东西必须先理解这个配置文件的语法. 配置在xml里面的元素接受这几个属性: 元素名称和描述 advertiser (可选)用于通知单个FileAppender或SocketAppender配置的插件名称.唯一提供的Adverti ser插件是"multic

《Log4j 2 官方文档》Configuring Filters

配置过滤器 Log4j允许在下面4个地方中任意一个指定过滤器: 与追加器,记录器和属性元素处于同一级别. 这些过滤器可以在事件传递到LoggerConfig之前接受或拒绝事件. 在记录器元素中. 这些过滤器可以接受或拒绝特定记录器的事件. 在一个appender元素. 这些过滤器可以防止或导致事件由追加器处理. 在追加器引用元素中. 这些过滤器用于确定记录器是否应将事件路由到追加器. 虽然只能配置单个 filter元素,但该元素可以是代表CompositeFilter的 filters元素. f

《Log4j 2 官方文档》Testing in Maven

在 Maven 中使用测试 Maven在整个构建生命周期内可以运行单元测试和功能测试.默认情况下, 任何在 src/test/resources 路径下的文件都会复制到 target/test-classes 路径中, 同时这些文件在执行测试过程中,也会被包含在 classpath 中. 正因为这样的特性,如果将一个 log4j2-test.xml 文件放到 src/test/resources 目录中, 这会替换掉当前正在使用的 log4j2.xml 或 log4j2.json 配置.因此,

《Apache Velocity用户指南》官方文档

Quick Start 本项目是 Apache Velocity官方文档的中文翻译版,Velocity类似与JSP,是一种基于Java的模板引擎.它可以在web页面中引用Java代码中定义的数据和对象,而Velocity的作用就是把Web视图和java代码进行组装在一起.本次翻译主要针对对Velocity感兴趣和工作中使用到Velocity的开发人员提供有价值的中文资料,希望能够对大家的工作和学习有所帮助. 由于我也是第一次接触Velocity,还不是很深入,翻译的时候也查看了一些博客以及其他网

【OH】Oracle软件安装需要的软件包(官方文档)

[OH]Oracle软件安装需要的软件包(官方文档) 1  安装12c 1.1  Table 3 x86-64 Supported Linux 7 Operating System Requirements Item Requirements SSH Requirement Ensure that OpenSSH is installed on your servers. OpenSSH is the required SSH software. Oracle Linux 7 Subscribe

jQuery 1.4官方文档详细讲述新特性功能

为了庆祝jQuery的四周岁生日, jQuery的团队荣幸的发布了jQuery Javascript库的最新主要版本! 这个版本包含了大量的编程,测试,和记录文档的工作,我们为此感到很骄傲. 我要以个人的名义感谢 Brandon Aaron, Ben Alman, Louis-Rémi Babe, Ariel Flesler, Paul Irish, Robert Kati?, Yehuda Katz, Dave Methvin, Justin Meyer, Karl Swedberg, and

TestNG官方文档中文版(9)-重复失败测试,junit测试,jdk1.4支持

5.10 - Rerunning failed tests 套件中的测试失败时,每次testNG都会在输出目录中创建一个名为testng-failed.xml 的文件.这个xml文件包含只重新运行这些失败的测试方法的必要信息,容许只运行这些 失败的测试而不必运行全部测试.因此,一种典型的情况将是这样: java -classpath testng.jar;%CLASSPATH% org.testng.TestNG -d test-outputs testng.xml java -classpat

TestNG官方文档中文版(6)-参数

5.5 - Parameters 测试方法不要求是无参数的.你可以在每个测试方法上使用任意数量的参数,并指示 testNG传递正确的参数. 有两种方式用于设置参数:使用testng.xml或者编程式. 5.5.1 - Parameters from testng.xml 如果你要为你的参数使用简单值,你可以在你的testng.xml中明确指定: @Parameters({ "first-name" }) @Test public void testSingleString(String