Logback为何读取类名而非自定义Logger名称?SIFT无法生成对应日志文件
这问题大概率是Logger初始化逻辑错误或者配置/绑定异常导致的,具体可以从这几个方向排查:
枚举类的Logger初始化错误
检查你的LogManager枚举实现,确保每个枚举实例是通过LoggerFactory.getLogger(自定义名称)来初始化的,而不是传入枚举类或调用类的Class对象。比如错误写法:// 错误:返回的是枚举类的全限定名 this.logger = LoggerFactory.getLogger(LogManager.class);正确写法应该是:
LogManager(String loggerName) { this.logger = LoggerFactory.getLogger(loggerName); }如果你在这里传错了参数,Logger的名称自然会变成类的全限定名,而非你定义的"console"、"client"。
SLF4J绑定冲突
检查项目依赖,确保只有Logback这一种SLF4J实现绑定。如果同时存在log4j-over-slf4j、slf4j-log4j12这类依赖,会导致SLF4J的LoggerFactory行为异常,可能返回不符合预期的Logger实例。可以通过mvn dependency:tree(Maven)或./gradlew dependencies(Gradle)查看依赖树,排除冲突的绑定依赖。调用Logger时的封装错误
确认业务代码中调用Logger的方式是直接使用LogManager枚举返回的实例,而非在中间封装层重新通过LoggerFactory.getLogger(当前类.class)获取Logger。比如如果有工具类封装了日志输出,但内部又重新获取了基于调用类的Logger,那最终输出的日志事件里的Logger名称还是调用类的全限定名。自定义鉴别器逻辑错误
检查你的自定义鉴别器代码,确保getDiscriminatingValue方法返回的是event.getLoggerName(),而不是调用者的类名(比如通过event.getCallerData()获取的类名)。错误的鉴别器逻辑会导致你拿到的不是Logger的名称,而是调用类的全限定名。
内容的提问来源于stack exchange,提问作者ahrooran

