依赖升级后Logback启动报错:marker is not an rvalue求助
问题解决:Logback EvaluatorFilter启动报错"Expression 'marker' is not an rvalue"
问题根源
升级到Logback 1.4.x(配合Spring Boot 3.x和Java 17)后,Janino表达式的上下文变量暴露方式发生了变化:原来直接引用的marker变量不再直接可用,必须通过日志事件对象event的getMarker()方法获取标记实例。旧写法在新版本中会被Janino判定为非法的右值,导致编译失败。
解决方案
修改logback-spring.xml中的EvaluatorFilter表达式,将直接引用marker改为通过event.getMarker()获取,并保留类型判断逻辑:
<filter class="ch.qos.logback.core.filter.EvaluatorFilter"> <evaluator> <expression> return event.getMarker() instanceof com.package.logging.Metrics.Marker; </expression> </evaluator> <onMatch>DENY</onMatch> <onMismatch>NEUTRAL</onMismatch> </filter>
额外优化(可选)
为了更严谨地处理日志事件无标记的场景(instanceof本身会自动处理null返回false),可以显式增加空判断:
<expression> return event.getMarker() != null && event.getMarker() instanceof com.package.logging.Metrics.Marker; </expression>
验证
修改配置后重新启动应用,启动报错会消失,过滤器将恢复正常工作,正确拦截标记为Metrics.Marker的日志事件。
内容的提问来源于stack exchange,提问作者dev-rifaii
相关产品推荐
相关产品推荐

