1、建立 文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "">
<log4j:configuration>
<appender name="CONSOLE" class=".">
<layout class=".">
<param name="ConversionPattern"
value="%d{yyyy-MM-dd HH:mm:ss} [%t] %-5p %c - %m%n" />
</layout>
<!--限制输出级别-->
<filter class=".">
<param name="LevelMax" value="ERROR"/>
<param name="LevelMin" value="TRACE"/>
</filter>
</appender>
<appender name="FILE" class=".">
<param name="File" value="/data/log/"/>
<layout class=".">
<param name="ConversionPattern"
value="%d{yyyy-MM-dd HH:mm:ss} [%t] %-5p %c - %m%n" />
</layout>
<filter class=".">
<param name="LevelMax" value="ERROR"/>
<param name="LevelMin" value="TRACE"/>
</filter>
</appender>
<apender name="ROLLING_FILE" class=".">
<param name="File" value="/data/log/"/>
<param name="Append" value="true"/>
<param name="MaxFileSize" value="1024KB"/>
<layout class=".">
<param name="ConversionPattern"
value="%d{yyyy-MM-dd HH:mm:ss} [%t] %-5p %c - %m%n" />
</layout>
</apender>
<appender name="DATABASE" class="">
<param name="Threshold" value="INFO" />
<filter class="">
</filter>
<layout class=".">
<param name="ConversionPattern"
value="INSERT INTO account_operate_log (aol_id,operate_type,operate_content,operate_result,user_id,user_name,operate_date,operate_ip,organization) VALUES(UUID(),'%X{operate}','%X{content}',1,%X{userid},'%X{username}',%d{yyyyMMddHHmmss},'%X{ip}','%X{organization}')" />
</layout>
</appender>
<appender name="ASYNC" class=".">
<param name="BufferSize" value="256" />
<appender-ref ref="ROLLING_FILE" />
<appender-ref ref="FILE" />
</appender>
<root>
<priority value="debug" />
<appender-ref ref="CONSOLE" />
<appender-ref ref="FILE" />
<appender-ref ref="ROLLING_FILE" />
<appender-ref ref="DATABASE" />
<appender-ref ref="ASYNC" />
</root>
</log4j:configuration>
2、 依赖类的实现
import ;
import ;
import .;
import .;
import ;
import ;
import ;
/**
* @Description
* 用于Log4j的数据库Session管理[连接池用Druid]
* @version 1.0
*/
public class MyJDBCAppender extends JDBCAppender
{
/* Druid数据源 */
private static DruidDataSource dataSource;
public MyJDBCAppender() {
super();
}
static{
ApplicationContext context = new ClassPathXmlApplicationContext("");
dataSource= (DruidDataSource) ("dataSource");
// 这里博主是用的alibaba 的Druid 的连接池 ,原先使用的c3p0连接池,使用此种方式获取不到连接池,而且项目中,c3p0总是关闭连接错误,所以果断改为了Druid ,不失所望,Druid 很好用,效率很高,Druid连接池的配置会贴在此文最后
}
@Override
protected void closeConnection(Connection con) {
try {
/* 如果数据库连接对象不为空和没有被关闭的话,关闭数据库连接 */
if ( con != null && !())
();
} catch (SQLException e) {
("Error closing () 's connection",e,ErrorCode.GENERIC_FAILURE);
}
}
@Override
protected Connection getConnection() throws SQLException {
return ();
}
/* 取消初始化 */
public void uninitialize() {
try {
if (dataSource != null)
();
} finally {
super.close();
}
}
}
3、 依赖类的实现
import ;
import ;
import .;
import org.;
public class CustomWarnLevelFilter extends org.apache.log4j.spi.Filter{
@Override
public int decide(LoggingEvent event) {
//大于等于WARN的日志不允许输出
// if(().toInt() >= Level. ()) {
// return DENY;
// } else {
// return ACCEPT;
// }
();
if(()!=null && isContainChinese(().toString()) && null !=("userid")){
if( isContainGt(().toString())){
String[] split = ().toString().split(">");
("operate", split[0]+"");
("content", ().toString()+"");
return ACCEPT;
}else if( ().toString().indexOf("登录")>-1 || ().toString().indexOf("退出")>-1
|| ().toString().indexOf("列表")>-1 || ().toString().indexOf("主页")>-1 || ().toString().indexOf("导入")>-1){
("operate", ().toString());
("content", ().toString());
return ACCEPT;
}else{
return DENY;
}
}else{
return DENY;
}
}
public static boolean isContainChinese(String str) {
Pattern p = ("[\u4e00-\u9fa5]");
Matcher m = (str);
if (()) {
return true;
}
return false;
}
public static boolean isContainGt(String str) {
Pattern p = ("(.*)(?:>)");
Matcher m = (str);
if (()) {
return true;
}
return false;
}
}
4、在登陆的拦截器 中要将 userId 和 企业id 放入MDC 中去,然后在 中 用 %X{userid} 方式可取出其值
import ;
import ;
import org.;
import org.;
import org.;
import ;
import ;
public class LoginInterceptor extends HandlerInterceptorAdapter{
private static final Logger LOG = ();
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
HandlerMethod handlerMethod = (HandlerMethod) handler;
if ("GET".equalsIgnoreCase(())) {
}
String requestUri = ();
("requestUri:"+requestUri);
String requestURI = ();
if(null != (false)){
UserInfo user = (UserInfo) (false).getAttribute("UserInfo");
if(null == user){
("未登录,请先登录");
(false).setAttribute("msg", "用户未登录,请先登录");
("/pages/").forward(request, response);
return false;
}else{
("userid", ()+"");
("username", ()+"");
("ip", ()+"");
Enterprise enter = (Enterprise) (false).getAttribute("Enterprise");
if(null !=()){
("organization", ()+"");
}else{
("organization","");
}
}
}else{
("未登录,请先登录");
("/pages/").forward(request, response);
return false;
}
return true;
}
}
5、 中的Druid 连接池的配置
<!-- 配置数据源 -->
<bean id="dataSource" class="" init-method="init" destroy-method="close">
<!-- 基本属性 url、user、password -->
<property name="driverClassName" value="" />
<property name="url" value="jdbc:mysql://********:3306/logistic?useUnicode=true&characterEncoding=utf-8" />
<property name="username" value="****" />
<property name="password" value="****" />
<!-- 配置初始化大小、最小、最大 -->
<property name="initialSize" value="5" />
<property name="minIdle" value="10" />
<property name="maxActive" value="20" />
<!-- 配置获取连接等待超时的时间 -->
<property name="maxWait" value="60000" />
<!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
<property name="timeBetweenEvictionRunsMillis" value="60000" />
<!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
<property name="minEvictableIdleTimeMillis" value="300000" />
<property name="validationQuery" value="SELECT 'x'" />
<property name="testWhileIdle" value="true" />
<property name="testOnBorrow" value="false" />
<property name="testOnReturn" value="false" />
<!-- 打开PSCache,并且指定每个连接上PSCache的大小 -->
<property name="poolPreparedStatements" value="true" />
<property name="maxPoolPreparedStatementPerConnectionSize" value="20" />
<!-- 配置监控统计拦截的filters -->
<property name="filters" value="stat" />
</bean>
6、在 中加入Druid 的监控,启动应用,访问http://localhost/应用名/monitor/ 就可以看到Druid 的监控页面了
<servlet>
<servlet-name>DruidStatView</servlet-name>
<servlet-class></servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>DruidStatView</servlet-name>
<url-pattern>/monitor/*</url-pattern>
</servlet-mapping>