lo4j2 日志保存进数据库,在window下运行正常,linux运行日常保存不进数据库的原因。

来源:互联网 发布:服装工艺 软件 编辑:程序博客网 时间:2024/04/29 10:32

linux下的路径切记要注意啊。


碰到linux运行日常保存不进数据库,没得说,首先问度娘。网上要么说是架包问题,要么问题没和我的场景不一样,没办法只有靠自己了。

一开始我怀疑是数据库的原因,.....,中间过程省略N久,反正最后确定不是。再省略N多过程。

最后怀疑是路径问题。


eserver-log4j.xml配置文件

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beans classpath:org/springframework/beans/factory/xml/spring-beans-4.2.xsdhttp://www.springframework.org/schema/tx classpath:org/springframework/transaction/config/spring-tx-4.2.xsdhttp://www.springframework.org/schema/context classpath:org/springframework/context/config/spring-context-4.2.xsd"default-lazy-init="true"><!-- log4j数据库 --><bean id="logDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"><property name="driverClass" value="com.mysql.jdbc.Driver" /><property name="jdbcUrl" value="jdbc:mysql://183.129.205.100:3306/paylog_2015?useUnicode=yes&characterEncoding=UTF-8" /><property name="user" value="pay" /><property name="password" value="pay2015" /><property name="checkoutTimeout" value="5000"/><property name="initialPoolSize" value="2"/><property name="minPoolSize" value="2"/><property name="maxPoolSize" value="30"/><property name="maxIdleTime" value="60"/><property name="acquireIncrement" value="10"/><property name="preferredTestQuery" value="select 1"/></bean> <!-- log4j数据库 <bean id="logDataSource" class="com.alibaba.druid.pool.DruidDataSource"><property name="driverClassName" value="com.mysql.jdbc.Driver" /><property name="url" value="jdbc:mysql://172.16.0.137:33060/b2blog_2015" /><property name="username" value="b2b" /><property name="password" value="b2b2015" /></bean>--></beans>



我们看log4j2的配置文件

<?xml version="1.0" encoding="UTF-8"?><Configuration status="off" monitorInterval="1800">    <Appenders>        <Console name="Console" target="SYSTEM_OUT">            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />        </Console>        <RollingRandomAccessFile name="running-log" fileName="${sys:logPath}/b2b.log" filePattern="${sys:logPath}/$${date:yyyy-MM}/b2b-%d{yyyy-MM-dd}-%i.log.gz">            <PatternLayout                pattern="%date{yyyy-MM-dd HH:mm:ss.SSS} %level [%thread][%file:%line] - %msg%n" />            <Policies>                <TimeBasedTriggeringPolicy />                <SizeBasedTriggeringPolicy size="10 MB" />            </Policies>            <DefaultRolloverStrategy max="200" />        </RollingRandomAccessFile>            <JDBC name="databaseAppender" tableName="syslog">      <span style="background-color: rgb(255, 0, 0);"><ConnectionFactory class="com.boyuan.common.log4j.db.ConnectionFactory" method="getDatabaseConnection" /></span>      <Column name="EVENT_ID" literal="uuid()" />      <Column name="EVENT_DATE" isEventTimestamp="true" />      <Column name="LEVEL" pattern="%level" />      <Column name="LOGGER" pattern="%logger" />      <Column name="MESSAGE" pattern="%message" />      <Column name="THROWABLE" pattern="%ex{full}" isClob="true"/>    </JDBC>            </Appenders>        <Loggers>    <!--         <Logger name="com.boyuan" level="debug" additivity="false">            <AppenderRef ref="running-log" />        </Logger>     -->            <Root level="info">            <AppenderRef ref="Console" />            <AppenderRef ref="databaseAppender" />          </Root>    </Loggers></Configuration>

在配置中 把Configuration 的status 改为 trace 方便调试,这样做log4j会把错误信息打印到Console
<Configuration status="trace" monitorInterval="1800">

上面配置中红色标记的部分,代码如下

package com.boyuan.common.log4j.db;import java.sql.Connection;import java.sql.SQLException;import javax.sql.DataSource;import org.springframework.context.ApplicationContext;import org.springframework.context.support.FileSystemXmlApplicationContext;import com.boyuan.common.Common;public class ConnectionFactory {    private static interface Singleton {        final ConnectionFactory INSTANCE = new ConnectionFactory();    }    private final DataSource log_ds;private ConnectionFactory() {    String path=Common.PROJECT_REAL_PATH + "WEB-INF/configs/eserver-log4j.xml";         //FileSystemXmlApplicationContext总是会去掉开头的/,所以加上 file: 或者 classpath:eserver-log4j.xml    ApplicationContext context = new FileSystemXmlApplicationContext("file:"+path);            this.log_ds = (DataSource)context.getBean("logDataSource");    }    public static Connection getDatabaseConnection() throws SQLException {        Connection conn = Singleton.INSTANCE.log_ds.getConnection();        return conn;    }}

String path = getServletConfig().getServletContext().getRealPath("/");Common.PROJECT_REAL_PATH = path;

上面

path 打印出来

/usr/local/apache-tomcat-8.0.29/webapps/merchant/WEB-INF/configs/log4j2.xml

路径没问题

再往下

FileSystemXmlApplicationContext
这个类,找出源码,其中有这么一段

  protected Resource getResourceByPath(String path)  {    if ((path != null) && (path.startsWith("/"))) {      path = path.substring(1);    }    return new FileSystemResource(path);  }

看到没,
FileSystemXmlApplicationContext
返回的路径会默认帮你去掉开头的“/”,所以最后加载数据源的路径变为了  usr/local/apache-tomcat-8.0.29/webapps/merchant/WEB-INF/configs/log4j2.xml

linux 下会找不到此路径,导致数据源没加载到。最后导致日志数据没保存。


这个问题真尼玛坑爹啊,花了N久,结果就是这么个小问题导致的。我艹。


l

0 0
原创粉丝点击