首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Spring作为BoneCPDataSource 2 Log4j的数据源?

如何使用Spring作为BoneCPDataSource 2 Log4j的数据源?
EN

Stack Overflow用户
提问于 2013-07-11 12:23:49
回答 1查看 3.8K关注 0票数 5

我想将log4j2消息记录到关系数据库中。

JDBC的文档是这里。我可以使用以下资源作为数据库连接提供程序:

  • ConnectionFactory
  • DataSource
  • DriverManager

但是,我们在整个应用程序中使用的数据源bean (com.jolbox.bonecp.BoneCPDataSource)有哪些方式呢?

EN

回答 1

Stack Overflow用户

发布于 2015-06-02 14:20:45

您可以分4个步骤(步骤2和步骤3是web应用程序的log4j2配置):

步骤1:创建log4j2.xml文件(没有JDBC )并将其放入WEB文件夹

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO">

    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
        </Console>

    </Appenders>

    <Loggers>
        <Root level="info">
            <AppenderRef ref="Console"/>
        </Root>
    </Loggers>

</Configuration>

步骤2:将log4j2-web-2.x.jar添加到WEB/lib.

这里是maven储存库,您可以从那里下载jar,或者将依赖项复制到您的pom.xml (如果您使用maven )。

步骤3:根据servlet版本配置web.xml

有关详细信息,请参阅log4j2 文档。下面是如何在Servlet2.5web应用程序中配置log4j。

代码语言:javascript
复制
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="WebApp_ID" version="2.5">

<!-- Logg -->
<listener>
    <listener-class>org.apache.logging.log4j.web.Log4jServletContextListener</listener-class>
</listener>
<filter>
    <filter-name>log4jServletFilter</filter-name>
    <filter-class>org.apache.logging.log4j.web.Log4jServletFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>log4jServletFilter</filter-name>
    <url-pattern>/*</url-pattern>
    <dispatcher>REQUEST</dispatcher>
    <dispatcher>FORWARD</dispatcher>
    <dispatcher>INCLUDE</dispatcher>
    <dispatcher>ERROR</dispatcher>
</filter-mapping>
<!-- /Logg -->

<!-- ... -->
</web-app>

步骤4:创建一个spring,注入JDBC,并在@PostConstruct 中动态添加JDBC配置

下面是代码示例(用log4j 2.1和Spring3.5测试)

代码语言:javascript
复制
import java.sql.Connection;
import java.sql.SQLException;

import javax.annotation.PostConstruct;
import javax.sql.DataSource;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.core.Appender;
import org.apache.logging.log4j.core.LoggerContext;
import org.apache.logging.log4j.core.appender.db.jdbc.ColumnConfig;
import org.apache.logging.log4j.core.appender.db.jdbc.ConnectionSource;
import org.apache.logging.log4j.core.appender.db.jdbc.JdbcAppender;
import org.apache.logging.log4j.core.config.AppenderRef;
import org.apache.logging.log4j.core.config.Configuration;
import org.apache.logging.log4j.core.config.LoggerConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;


@Component
public class LogUtils{

  @Autowired
  private DataSource dataSource;

  //inner class
  class Connect implements ConnectionSource {
    private DataSource dsource;
    public Connect(DataSource dsource) {
        this.dsource = dsource;
    }
    @Override
    public Connection getConnection() throws SQLException {
        return this.dsource.getConnection();
    }
    
  }

  public LogUtils() {
    System.out.println("LogUtils");     
  }

  @PostConstruct
  private void init(){
    System.out.println("init LogUtils");    
    final LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
    final Configuration config = ctx.getConfiguration();
    ColumnConfig[] cc = {
            ColumnConfig.createColumnConfig(config, "date", null, null, "true", null, null),
            ColumnConfig.createColumnConfig(config, "level", "%level", null, null, null, null),
            ColumnConfig.createColumnConfig(config, "logger", "%logger", null, null, null, null),
            ColumnConfig.createColumnConfig(config, "message", "%message", null, null, null, null),
            ColumnConfig.createColumnConfig(config, "throwable", "%ex{short}", null, null, null, null),
            ColumnConfig.createColumnConfig(config, "salarie_id", "%X{SALARIE_ID}", null, null, null, null)
    } ;     
    Appender appender = JdbcAppender.createAppender("databaseAppender", "true", null, new Connect(dataSource), "0", "sicdb.bo_log", cc);
    appender.start();
    config.addAppender(appender);
    LoggerConfig loggerConfig = config.getLoggerConfig(LogManager.ROOT_LOGGER_NAME);
    loggerConfig.addAppender(appender, null, null);
    ctx.updateLoggers();        
  }

  public DataSource getDataSource() {
    return dataSource;
  }

  public void setDataSource(DataSource dataSource) {
    this.dataSource = dataSource;
  }


}

**限制:链接到文档**

应用程序有时需要与实际配置分开自定义日志记录。Log4j允许这样做,尽管它有一些限制:

  1. 如果配置文件被更改,配置将被重新加载,手动更改将丢失。
  2. 对正在运行的配置的修改要求调用的所有方法(addAppender和addLogger)都是同步的。因此,自定义配置的推荐方法是扩展标准配置类之一,重写安装方法以首先执行super.setup(),然后在注册使用配置之前将自定义附录、过滤器和LoggerConfigs添加到配置中。
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17593308

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档