{"record":{"id":"e4067692554d6a57","repo":"jenkinsci/jenkins","slug":"plugin-class-getclass-getname-does-not-ove","errorCode":null,"errorMessage":"Plugin class '{getClass().getName()}' does not override either overload of the decorateLogger method.","messagePattern":"Plugin class '(.+?)' does not override either overload of the decorateLogger method\\.","errorType":"exception","errorClass":"AbstractMethodError","httpStatus":null,"severity":"error","filePath":"core/src/main/java/hudson/console/ConsoleLogFilter.java","lineNumber":72,"sourceCode":" */\npublic abstract class ConsoleLogFilter implements ExtensionPoint {\n    /**\n     * Called on the start of each build, giving extensions a chance to intercept\n     * the data that is written to the log.\n     *\n     * @throws AbstractMethodError\n     *     when a plugin overrides neither this method nor {@link #decorateLogger(Run, OutputStream)}.\n     *\n     * @deprecated as of 1.632. Use {@link #decorateLogger(Run, OutputStream)}\n     */\n    @Deprecated\n    public OutputStream decorateLogger(AbstractBuild build, OutputStream logger) throws IOException, InterruptedException {\n        if (Util.isOverridden(ConsoleLogFilter.class, getClass(), \"decorateLogger\", Run.class, OutputStream.class)) {\n            // old client calling newer implementation. forward the call.\n            return decorateLogger((Run) build, logger);\n        } else {\n            // happens only if the subtype fails to override either decorateLogger method\n            throw new AbstractMethodError(\"Plugin class '\" + this.getClass().getName() + \"' does not override \" +\n                    \"either overload of the decorateLogger method.\");\n        }\n    }\n\n    /**\n     * Called on the start of each build, giving extensions a chance to intercept\n     * the data that is written to the log.\n     *\n     * <p>\n     * Even though this method is not marked 'abstract', this is the method that must be overridden\n     * by extensions.\n     */\n    public OutputStream decorateLogger(Run build, OutputStream logger) throws IOException, InterruptedException {\n        // this implementation is backward compatibility thunk in case subtypes only override the\n        // old signature (AbstractBuild,OutputStream)\n\n        if (build instanceof AbstractBuild) {\n            // maybe the plugin implements the old signature.","sourceCodeStart":54,"sourceCodeEnd":90,"githubUrl":"https://github.com/jenkinsci/jenkins/blob/2e228ff40b14dbc8b14ffbc6edf0e4383cf744fc/core/src/main/java/hudson/console/ConsoleLogFilter.java#L54-L90","documentation":"AbstractMethodError thrown by the deprecated ConsoleLogFilter.decorateLogger(AbstractBuild, OutputStream) when a subclass overrides neither that method nor decorateLogger(Run, OutputStream). Util.isOverridden detects the missing Run-based override, so the old method cannot forward and aborts. The class is documented as requiring the Run overload to be implemented.","triggerScenarios":"A plugin's ConsoleLogFilter extension that overrides neither decorateLogger overload, invoked through the legacy AbstractBuild API (older core or another plugin).","commonSituations":"Plugin compiled against an old core; an empty/stub ConsoleLogFilter subclass; core upgraded past 1.632 where the Run overload became the expected one.","solutions":["Override decorateLogger(Run, OutputStream) in the subclass.","If you must support pre-1.632 cores, override both overloads.","Audit ConsoleLogFilter subclasses after a core upgrade."],"exampleFix":"// before\npublic class MyFilter extends ConsoleLogFilter { }\n// after\npublic class MyFilter extends ConsoleLogFilter {\n    @Override\n    public OutputStream decorateLogger(Run build, OutputStream logger)\n            throws IOException, InterruptedException {\n        return new MyStream(logger);\n    }\n}","handlingStrategy":"validation","validationCode":"if (!Util.isOverridden(ConsoleLogFilter.class, filter.getClass(),\n        \"decorateLogger\", Run.class, OutputStream.class)) {\n    // subclass must override the Run overload\n}","typeGuard":null,"tryCatchPattern":"try { filter.decorateLogger(build, out); }\ncatch (AbstractMethodError e) { /* subclass overrides neither overload */ }","preventionTips":["Always override decorateLogger(Run, OutputStream) in ConsoleLogFilter subclasses.","Audit plugin ConsoleLogFilter extensions after core upgrades."],"tags":["plugin","console","api-compat","abstract-method"],"backgroundTag":null,"analyzedSha":"2e228ff40b14dbc8b14ffbc6edf0e4383cf744fc","analyzedAt":"2026-08-14T07:07:15.274Z","schemaVersion":2},"datasetVersion":"2026-08-14T10:17:34.591Z"}