【问题标题】:Log4j2 routing appender JavaScript config errorLog4j2 路由附加程序 JavaScript 配置错误
【发布时间】:2017-01-22 11:25:19
【问题描述】:

我正在使用 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 相当陌生,但这段代码似乎是一个有效的脚本。我有什么问题吗?

提前致谢。

【问题讨论】:

    标签: javascript java logging log4j2 appender


    【解决方案1】:

    (声明:我从未使用过 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>
    

    【讨论】:

    • 谢谢。我的解决方法类似:只需删除 return 即可。
    猜你喜欢
    • 1970-01-01
    • 2017-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-30
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    相关资源
    最近更新 更多