当前位置: 首页 > 知识库问答 >
问题:

Log4j2路由追加器JavaScript配置错误

巫马嘉祯
2023-03-14

我正在使用lombok的log4j2记录器,需要基于ThreadContext映射配置路由附加器。路由键由脚本确定。这是整个log4j2。xml配置文件:

<Appenders>
    <Console name="Console" target="SYSTEM_OUT">
        <PatternLayout pattern="%highlight{%d{yyyy-MM-dd HH:mm:ss} [%t] %-5level %c{1}: %msg%n%throwable}"/>
    </Console>

    <RollingFile name="GeneralRollingFile" filename="log/test-log.log"
                 filepattern="log/test-log-%d{yyyy-MM-dd HH:mm:ss}.log">
        <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} [%t] %-5level %c{1}: %msg%n%throwable"/>
        <Policies>
            <SizeBasedTriggeringPolicy size="25 MB"/>
        </Policies>
        <DefaultRolloverStrategy max="20"/>
    </RollingFile>

    <Routing name="Routing">

        <Routes>
            <Script name="RoutingInit" language="JavaScript">
                <![CDATA[
                if (logEvent.getContextMap().containsKey("operation-1")) {
                    return "operation-1";
                } else if (logEvent.getContextMap().containsKey("operation-2")) {
                    return "operation-2";
                } else {
                    return "general";
                }
            ]]>
            </Script>

            <Route key="general" ref="GeneralRollingFile"/>

            <Route key="operation-1"> 
                <RollingFile name="operation-1-rolling"
                             fileName="log/operation-1/${ctx:operation-1}.log"
                             filePattern="log/operation-1/${ctx:operation-1}-%d{yyyy-MM-dd HH:mm:ss}.log">

                    <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} [%t] %-5level %c{1}: %msg%n%throwable"/>
                    <Policies>
                        <SizeBasedTriggeringPolicy size="25 MB"/>
                    </Policies>
                    <DefaultRolloverStrategy max="20"/>
                </RollingFile>
            </Route>

            <Route key="operation-2"> 
                <RollingFile name="operation-2-rolling"
                             fileName="log/operation-2/${ctx:operation-2}.log"
                             filePattern="log/operation-2/${ctx:operation-2}-%d{yyyy-MM-dd HH:mm:ss}.log">

                    <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} [%t] %-5level %c{1}: %msg%n%throwable"/>
                    <Policies>
                        <SizeBasedTriggeringPolicy size="25 MB"/>
                    </Policies>
                    <DefaultRolloverStrategy max="20"/>
                </RollingFile>
            </Route>

        </Routes>


    </Routing>

</Appenders>

<Loggers>
    <Root level="trace" additivity="false">
        <AppenderRef ref="Console"/>
        <AppenderRef ref="Routing"/>
    </Root>
</Loggers>

但是,我得到以下错误:

 main ERROR Error running script RoutingInit javax.script.ScriptException: <eval>:2:24 Invalid return statement
                    return "operation-1";

Log4j2留档给了我们一个类似的脚本示例,它不适用于我的以太。我对JS相当陌生,但此代码似乎是一个有效的脚本。我是不是做错了什么?

提前谢谢。

共有1个答案

令狐俊风
2023-03-14

(迪克莱默:我从来没有使用过log4j2,也没有在Java中嵌入Javascript等等。不管怎样,我在回答你的问题时四处看看……)

它看起来不是很像吗https://stackoverflow.com/a/38034571/118587?

从这个意义上说,如果我正确理解了他们的建议,那么如果它不是函数,那么不应该使用return,而返回的值将是最后一个表达式的值,因此(无需检查),我可以猜测一下,并说以下内容将起作用:

        <Script name="RoutingInit" language="JavaScript">
            <![CDATA[
            var ret = "general";
            if (logEvent.getContextMap().containsKey("operation-1")) {
                ret = "operation-1";
            } else if (logEvent.getContextMap().containsKey("operation-2")) {
                ret = "operation-2";
            }
            ret;
        ]]>
        </Script>
 类似资料:
  • 我是vertx的新手,所以可能我做错了什么。我正在尝试实施以下路线: 这是避免在所有处理程序中重复此逻辑的正确方法吗? 我试图链接处理程序,处理程序从路径中读取参数,试图找到相应的用户,并将该用户放入上下文中。如果未找到用户,则返回状态代码400。否则将调用下一个处理程序。我想对参数应用相同的原则。 在尝试实现这一点时,我认为我发现了路径的问题,更具体地说是尾部的斜线和星形。文档中指出,后面的斜杠

  • 每个路由可以有不同的属性; 一些常见的属性是: path - 应用程序在特定路由上时在浏览器中显示的URL component - 当应用程序在特定路由上时要呈现的组件 pathMatch - 默认为’prefix’的可选属性。 确定是匹配完整的网址还是仅匹配开头。 当定义一个具有空路径字符串的路径设置pathMatch为’full’时,否则它将匹配所有路径。 children - 表示此路由的子

  • 路由配置 路由的作用 路由配置是 CAT 集群流量负载均衡最重要的一环。路由配置提供了默认机器列表、多机房划分、地域划分等基本功能,路由选择的优先级为:同机房 > 同地域 > 默认机器 > 备用机器。 对于流量较高的机器,用户可以扩展相应的策略,通过路由配置将部分流量指定到低负载的机器。 配置入口 http:///localhost:8080/s/config?op=routerConfigUpd

  • V2Ray 内建了一个简单的路由功能,可以将入站数据按需求由不同的出站连接发出,以达到按需代理的目的。这一功能的常见用法是分流国内外流量,V2Ray 可以通过内部机制判断不同地区的流量,然后将它们发送到不同的出站代理。 RoutingObject RoutingObject 对应主配置文件中的routing项。 { "domainStrategy": "AsIs", "rules": []

  • 我正在尝试通过代码添加一个自定义的附加器,该附加器应该记录一些包。所有的工作都使用以下代码: 所以简而言之..正如您所看到的,如果之前没有定义追加器,我正在创建一个追加器。然后我为org.test创建一个记录器(如果没有添加的话),并将appender添加到这个记录器中。 多谢了。

  • 配置了Sleuth可以很方便查看微服务的调用路线图,可快速定位问题。 SOP基于SpringCloud,因此只要整合Spring Cloud Sleuth即可。 除此之外,还需要支持dubbo的链路的跟踪,Sleuth在2.0已经对dubbo做了支持,详见:brave-instrumentation-dubbo-rpc 接入Spring Cloud Sleuth步骤如下: 下载zipkin服务器