Logback 输出到 mySQL

Logback output to mySQL

我正在尝试将 Selenium 日志测试输出到 mysql 数据库。我有 logback.xml 位于包的 src:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<appender name="DB" class="ch.qos.logback.classic.db.DBAppender">
        <connectionSource class="ch.qos.logback.core.db.DriverManagerConnectionSource">
                <dataSource class="com.mysql.jdbc.jdbc2.optional.MysqlDataSource">
            <serverName>http://php4dvd.com.ua/openserver/</serverName>
            <port>3306</port>
            <databaseName>ConsoleOutput</databaseName>
            <user>root</user>
            <password></password>
                </dataSource>
        </connectionSource>
</appender>
        <root level="DEBUG" >
                <appender-ref ref="DB" />
        </root>
</configuration>

我的 JUnit 测试是:

package us.st.selenium.protocols;

import static org.junit.Assert.*;
import java.util.concurrent.TimeUnit;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.Keys;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.remote.RemoteWebDriver;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
import ch.qos.logback.core.db.ConnectionSource;
import ch.qos.logback.classic.db.DBAppender;

public class ConsoleOutputToMySql {

private RemoteWebDriver driver;

    private static Logger LOG = LoggerFactory.getLogger(ConsoleOutputToMySql.class);

    @Before
        public void initDriver(){
        LOG.debug("Starting Firefox");
        driver = new FirefoxDriver();
        LOG.debug("Firefox started");
        driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
    }

    @Test
    public void sampletest() throws Exception {
        LOG.info("Started sampletest");
        LOG.info("Go to main page");
        driver.get("http://php4dvd.com.ua");
        LOG.info("login as admin / admin");
        driver.findElement(By.id("username")).sendKeys("admin");
        driver.findElement(By.name("password")).sendKeys("admin");
        driver.findElement(By.name("submit")).sendKeys(Keys.RETURN);
        Thread.sleep(4000);

        LOG.info("logout");
        driver.findElement(By.xpath("//header//li[4]/a")).click();
        driver.switchTo().alert().accept(); 
        LOG.info("Finished sampleTest");
    }

    @After

    public void stopDriver(){
        LOG.debug("Firefox finished");
        driver.quit();
    }

}

我已经创建了包含 mysql 个字段的数据库。我可以在我的本地机器上通过这个 link 访问数据库 table:

http://php4dvd.com.ua/openserver/phpmyadmin/index.php?db=ConsoleOutput

这里是测试库: https://github.com/Arkhypov/Selenium_tests/tree/master/SeleniumIntermediate/src

当我 运行 测试时,我仍然看到控制台日志输出,而不是将日志附加到数据库。我好像忘记了什么...请问谁能帮忙?

ch.qos.logback.core.db.DriverManagerConnectionSource 没有数据源 属性 而 ch.qos.logback.core.db.DataSourceConnectionSource 有。你可能想像这样配置数据库

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<appender name="DB" class="ch.qos.logback.classic.db.DBAppender">
        <connectionSource class="ch.qos.logback.core.db.DataSourceConnectionSource">
                <dataSource class="com.mysql.jdbc.jdbc2.optional.MysqlDataSource">
            <serverName>http://php4dvd.com.ua/openserver/</serverName>
            <port>3306</port>
            <databaseName>ConsoleOutput</databaseName>
            <user>root</user>
            <password></password>
                </dataSource>
        </connectionSource>
</appender>
        <root level="DEBUG" >
                <appender-ref ref="DB" />
        </root>
</configuration>

或者您可以使用 JDBC 驱动程序代替 MysqlDataSource。

<configuration>

  <appender name="DB" class="ch.qos.logback.classic.db.DBAppender">
    <connectionSource class="ch.qos.logback.core.db.DriverManagerConnectionSource">
      <driverClass>com.mysql.jdbc.Driver</driverClass>
      <url>jdbc:mysql://host_name:3306/datebase_name</url>
      <user>username</user>
      <password>password</password>
    </connectionSource>
  </appender>

  <root level="DEBUG" >
    <appender-ref ref="DB" />
  </root>
</configuration>

另外,Logback 不能自己创建表。您需要创建数据库及其表。您可以从 here.

获取创建脚本

更新

如果您的 logback.xml 不在 class 路径中,您可以使用 属性 logback.configurationFile 指定您在启动应用程序时使用的日志文件。这是一个例子

 java -Dlogback.configurationFile=/path/to/config.xml chapters.configuration.MyApp1

在eclipse中你可以在运行配置中定义这种参数。您可以找到详细信息 here

更新 2

根据您的 github 项目,您在 class 路径上添加了 2 个 slf4j-api 实现。您可以删除 slf4j-simple-1.7.12.jar。并且仍然像这样使用 Logger。

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class MyService {
    private static final Logger logger = LoggerFactory.getLogger(MyService.class);
}

更新 3

我也在github, that demonstrate how to append log to database (postgresql) using logback and slf4j. You can get it from github中创建了一个maven项目。