代码之家  ›  专栏  ›  技术社区  ›  souki

使用Logback时出错

  •  1
  • souki  · 技术社区  · 7 年前

    我正在一个TCP服务器上工作,我正在尝试添加日志记录。我决定用 Logback . 这是我的代码:

    final static Logger logger = LoggerFactory.getLogger(Ecmg.class);
    
    public static void main(String[] args)
    {
        new Ecmg(args);
    }
    
    public Ecmg(String[] args) {
    
        logger.info("Hello world.");
    
        System.setProperty(ContextInitializer.CONFIG_FILE_PROPERTY, "/src/main/resources/logback.xml");
        LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
        StatusPrinter.print(lc);
    
        waitForConnection();
    }
    

    不幸的是,我得到了以下输出:

    [main] INFO Ecmg - Hello world. 
    Exception in thread "main" java.lang.ClassCastException: org.slf4j.simple.SimpleLoggerFactory cannot be cast to ch.qos.logback.classic.LoggerContext at Ecmg.<init>(Ecmg.java:41) at Ecmg.main(Ecmg.java:29) 
    Process finished with exit code 1
    

    显然,问题在于: LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory(); 。我是根据一个教程写的,这应该是可行的。这是我的 pom.xml :

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    
    <groupId>Server</groupId>
    <artifactId>Server</artifactId>
    <version>1.0-SNAPSHOT</version>
    
    
    
    <dependencies>
        <dependency>
            <groupId>io.vertx</groupId>
            <artifactId>vertx-core</artifactId>
            <version>3.5.1</version>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.2.3</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.8.0-beta2</version>
        </dependency>
    </dependencies>
    

    在重要的情况下,我使用Java 8和ITELLIJ 2018.1。

    我的问题是:为什么我会得到这个错误,以及 我怎么解决 ?

    音符: 我在网上没有发现任何东西,除了这个 SO question 可能与之相关。但问题还没有解决,所有的答案都没有对我有用。

    事先谢谢!

    1 回复  |  直到 7 年前
        1
  •  2
  •   Peter Cooper Jr.    7 年前

    SLF4J是一个标准化的日志记录接口。您使用它的API进行日志记录,并且 binding 在您要使用的实际日志框架的类路径上。

    如果你的 LoggerFactory.getILoggerFactory() 是一个 SimpleLoggerFactory ,然后使用 SimpleLogger 结合。您说您已经决定使用logback,但实际上您使用的是slf4j simplelogger。

    为了使用logback,需要确保它在类路径上,并且类路径上没有其他slf4j绑定。因为您使用maven来管理依赖项,所以可能需要运行“mvn” dependency:tree “查看所有依赖项的列表,以及依赖项带来的内容。这可以帮助您了解正在使用的其他绑定。

    与slf4j一起使用的行为良好的库将只包含slf4j API,因为绑定应该只由主应用程序使用。如果有一个行为不好的库尝试使用它自己的绑定,则可能需要使用maven to exclude 有约束力。

    而且,它通常有助于使用 <dependencyManagement> POM中的部分,以确保所有依赖项都使用相同版本的SLF4J API,并且不要试图全部包含它们自己的单独版本,以及使用 maven-enforcer-plugin bannedDependencies 确保在将来进行更改时不会出错的规则,并在项目中意外地包含另一个日志框架。