码迷,mamicode.com
首页 > 数据库 > 详细

通过weblogic配置log4jdbc数据源,在项目中使用该数据源,输出sql

时间:2016-05-18 10:52:55      阅读:548      评论:0      收藏:0      [点我收藏+]

标签:

通过weblogic配置log4jdbc数据源,在项目中使用该数据源,输出sql

说一下配置:
服务器weblogic
项目使用的是spring管理Bean,数据源配置也是基于Spring的dbcp数据源,并且用log4jdbc进行sql日志打印,采用logback+slf4j日志打印。log4jdbc能够很好打印sql,并且参数也带上了,这在项目开发与后期系统出现的问题查找原因都有很大的帮助。
数据库配置如下:
jdbc.driverClassName=net.sf.log4jdbc.DriverSpy
jdbc.url=jdbc:oracle:thin:@ip:port/dev
jdbc.username=user
jdbc.password=pwd

spring配置如下:
<bean id="dataSource" class="org.springframework.jdbc.datasource.LazyConnectionDataSourceProxy">
          <property name="targetDataSource">
               <ref local="mainDataSource"/>
          </property>
</bean>
 <bean id="mainDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
          <property name="driverClassName" value="${jdbc.driverClassName}"  />
          <property name="url" value="${jdbc.url}"  />
          <property name="username" value="${jdbc.username}"  />
          <property name="password" value="${jdbc.password}"  />
          <property name="initialSize" value="30"  />
          <property name="logAbandoned" value="true"  />
          <property name="maxActive" value="100"  />
          <property name="maxWait" value="310000" />
          <property name="minIdle" value="2" />
          <property name="maxOpenPreparedStatements" value="500" />
          <property name="removeAbandoned" value="true"/>
          <property name="removeAbandonedTimeout" value="300"/>
          <property name="poolPreparedStatements" value="false" />
          <property name="defaultAutoCommit" value="true" />
</bean>


在项目后期,客户要求不能使用项目配置的数据源,要使用weblogic的数据源。客户为大,就这么改了,改了后,log4jdbc的sql再也打印不出来了。
这是weblogic数据源的配置:
技术分享
技术分享
之前项目中有sql打印,log4jdbc也能打印出sql执行的参数,这样就能大概知道项目执行情况。没有了sql后,如果出了问题,不好定位问题,因此为了打印出sql进行了测试。

spring配置改为如下:
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
          <property name="jndiName">
               <value>lmsDatasource</value>
          </property>
          <property name="resourceRef">
            <value>false</value>
          </property>
          <property name="jndiEnvironment">
               <props>
                    <!-- The value of Context.PROVIDER_URL,这是配置weblogic的url,如t3://127.0.0.1:7001 -->
                    <prop key="java.naming.provider.url">t3://ip:weblogicport</prop>
                    <prop key="java.naming.factory.initial">weblogic.jndi.WLInitialContextFactory</prop>
              </props>
          </property>
     </bean>
weblogic数据源改为如下配置:
技术分享
技术分享
加载该驱动,需要用到如下几个jar包:
log4jdbc3-1.2beta2.jar
logback-classic-1.1.1.jar
logback-core-1.1.1.jar
slf4j-api-1.6.4.jar
并且weblogic启动时要加载这几个jar包。
在有篇文章中(http://blog.csdn.net/yjq8116/article/details/4498622)看到说直接将jar放到{domain_home}/lib中,会自动加载第三方jar包。但是我这样做了并没有生效。将jar包放在{wls_home}/server/lib下也没有生效,放在jdk目录加载第三方jar包的路径:{java_home}/jre/lib/ext,这个可以加载到了,但是这样会对本地的所有java程序都生效,会影响到其他项目的,因此不应该放在该目录下。

还要继续想办法,为什么明明weblogic自己也说了可以自动加载{domain_home}/lib下的jar,却没有加载了,百思不得其解。

后来在weblogic的启动日志中看到如下片段:
技术分享
技术分享
这个是weblogic加载第三方jar包的path配置,但是并没有发现该路径。在{domain_home}/bin/setDomainEnv.sh中看到了
技术分享
技术分享
这个weblogic.ext.dirs正是weblogic的console中加载的classPath。因此,想到可以直接手动添加此路径,这样就可以让weblogic在启动时加载第三方jar包了。

这是修改后的,变量${DOMAIN_HOME}的该文件之前,weblogic已有的定义。
技术分享
技术分享

修改后,启动weblogic,在{domain_home}执行命令:nohup ./startWebLogic.sh >./logs/weblogic"`date +%Y%m%d%H%M`".log 2>&1 &
启动,发现console打印出了很多日志,都是DEBUG级别的(关于LOG的级别,项目中用到的是logback,大家可以查找相关资料),这是最低的级别,所有的日志都会输出,显然这样的输出对我们来说并没有多大的意义,而且还影响系统性能。
技术分享

技术分享

但是,日志的打印,是根据自定义的格式进行打印的,为什么weblogic会打印这样的配置,而且还是debug级别的?后来在网上查到关于weblogic的日志配置问题,查到了这篇文章:http://bbs.middleware123.com/forum.php?mod=viewthread&tid=4532,上面说可以配置命令
 set LOG4J_CONFIG_FILE=/root/bea/user_projects/domains/MedRecDomain/log4jConfig.xml 
来配置log4j的文件(logback跟log4j都是日志系统,具体区别可以查找相关资料)。还真在setDomainEnv.sh文件找找到了这个配置:
技术分享

技术分享
我想对于程序员,虽然不了解shell,但是看到这个也大概知道这个意思吧,如果有变量:LOG4J_CONFIG_FILE,就加到JAVA_PROPERTIES中,我也不知道这个JAVA_PROPERTIES是干嘛的,但是改一下,或许有效果。突然觉得对于这个weblogic,真的很多都只能去动手试。增加了如下配置:
技术分享

技术分享
下面是我logback.xml的主要配置
<?xml version="1.0" encoding="UTF-8"?> 
<configuration> 
        <!-- log output to file  --> 
        <appender name="ROLLING" class="ch.qos.logback.core.rolling.RollingFileAppender"> 
                <file>logs/weblogiclog.txt</file> 
                <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> 
                        <!-- rollover daily --> 
                        <fileNamePattern>logs/weblogiclog-%d{yyyy-MM-dd}.%i.log</fileNamePattern> 
                        <maxHistory>10</maxHistory>  
                        <timeBasedFileNamingAndTriggeringPolicy 
                                class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> 
                                <!-- or whenever the file size reaches 100MB --> 
                                <maxFileSize>500MB</maxFileSize> 
                        </timeBasedFileNamingAndTriggeringPolicy> 
                </rollingPolicy> 
                <encoder> 

                        <!--<pattern>%date %level [%thread] %logger{36} [%file : %line] %msg%n</pattern>  -->
                        <pattern>%d{yy/MM/dd HH:mm:ss} %5level [%C{1}.%M\(%L\)] %m%n</pattern>
                </encoder> 
        </appender> 
        <!-- log output to console  --> 
        <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> 
                <encoder> 
                        <!--<pattern>%date %5level [%thread] %logger{36} [%file : %line] %msg%n</pattern>  -->
                        <!-- only show method name and line no
                        <pattern>%d{yy/MM/dd HH:mm:ss} %5level [%C{1}.%M\(%L\)] %m%n</pattern> -->
                        <!-- show method caller-->
                        <pattern>%d{yy/MM/dd HH:mm:ss} %5level %caller{1} - %msg%n</pattern>
                </encoder> 
        </appender> 

        <logger name="com.sinoservices" level="ERROR" additivity="false"> 
                <appender-ref ref="STDOUT" /> 
        </logger> 
        <logger name="jdbc.sqlonly" level="INFO">
                <!--  增加sql打印控制台 --> 
                <appender-ref ref="STDOUT" />
                <appender-ref ref="STDOUT" /> 
        </logger> 
        <logger name="jdbc.sqltiming" level="OFF"> 
                <appender-ref ref="ROLLING" /> 
        </logger> 
        <logger name="jdbc.audit" level="OFF"> 
                <appender-ref ref="ROLLING" /> 
        </logger> 
        <logger name="jdbc.resultset" level="OFF"> 
                <appender-ref ref="ROLLING" /> 
        </logger> 
        <logger name="jdbc.connection" level="OFF"> 
                <appender-ref ref="ROLLING" /> 
        </logger> 
        <root level="INFO">
                <appender-ref ref="ROLLING" />
        </root> 
</configuration> 
 下面是最终weblogic的console截图,打印日志的记录确实同我的配置的logback.xml的一致,也能打印sql参数了,并且之前在{domain_home}/logs/目录没有出现logs/weblogiclog.txt的滚动日志,现在也有了。弄了好久,总算弄出来了:
技术分享
技术分享
技术分享

技术分享

其实在项目中也有logback的配置,配置的logger appender是:
<appender name="ROLLING" class="ch.qos.logback.core.rolling.RollingFileAppender">  
                <file>logs/log.txt</file>  
                <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">  
                        <!-- rollover daily -->  
                        <fileNamePattern>logs/log-%d{yyyy-MM-dd}.%i.log</fileNamePattern>  
                        <maxHistory>10</maxHistory>   
                        <timeBasedFileNamingAndTriggeringPolicy  
                                class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">  
                                <!-- or whenever the file size reaches 100MB -->  
                                <maxFileSize>500MB</maxFileSize>  
                        </timeBasedFileNamingAndTriggeringPolicy>  
                </rollingPolicy>  
                <encoder>  
                        <!--<pattern>%date %level [%thread] %logger{36} [%file : %line] %msg%n</pattern>  -->
                        <pattern>%d{yy/MM/dd HH:mm:ss} %5level [%C{1}.%M\(%L\)] %m%n</pattern>
                </encoder>  
        </appender>  

后面又测试了一下,发现,weblogic的logback配置只能放在该domain下。并且如果直接放在domain目录下,也是可以不需要LOG4J_CONFIG_FILE配置。又试了几次放在其他目录的,发现起不到效果,不知道是不是只能放在domain目录下。

但是并没有生成项目中使用的配置,没有生成log.txt文件。这个之前是可以生成的,在改了这样的数据源之后,就不出来了,不知道是不是由于weblogic本身已经支持对logback的支持了,因此就将项目中的logback所配置的进行了屏蔽呢?

通过weblogic配置log4jdbc数据源,在项目中使用该数据源,输出sql

标签:

原文地址:http://blog.csdn.net/come_on_ha/article/details/51441150

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!