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
- lo4j2 日志保存进数据库,在window下运行正常,linux运行日常保存不进数据库的原因。
- Hibernate 中save方法运行成功之后却没有保存进数据库的原因
- 整合ssh对于数据的增删改查数据运行正常但在数据库中没保存
- windows 下保存shell文件为可以在Linux下运行的格式
- 不保存开始运行的记录
- 异步保存程序运行日志
- NLog日志——将日志保存在数据库中
- linux下在服务器上配置scrapy框架的python爬虫,使用mysql数据库保存
- cocos2dx在vs运行正常,在Android编译正常,运行错误的一个原因
- log4j 日志保存到数据库
- log4j.xml数据库保存日志
- log4j.xml数据库保存日志
- linux下的运行日志
- eclipse运行java程序时不自动保存的解决方法
- eclipse运行java程序时不自动保存的解决方法
- 在oracle数据库保存图片的方法
- 请问能否把程序运行时出现的异常堆栈信息也保存进log4j指定的日志文件中
- 如何在不影响hadoop集群正常运行的情况下迁移主控节点[namenode]
- UIViewController各个方法的加载顺序
- EXCEL工作表保护密码忘记,撤销保护攻略
- Android中自带的rsa加密算法和java中的区别
- iOS报错:does not contain bitcode
- ioS开发中plist文件的创建与简单读取
- lo4j2 日志保存进数据库,在window下运行正常,linux运行日常保存不进数据库的原因。
- Android中WebView的addJavascriptInterface混淆方法
- ORA-12704: character set mismatch问题、以及处理wm_concat函数clob乱码问题
- AFNetwork 3.0 源码解读 (一) 新版本的变化
- jQuery插件
- 大型网站技术架构(二)架构模式
- 内存管理
- Error 1935.安装程序集 Microsoft.vc80.atl,type="win32",version="8.0.50727.762"
- urlcode的理解