版权声明:自由转载-非商用-保持署名,觉得此文有用的,不嫌麻烦的话,就留个言,或者点个赞吧,如果觉得文章有错误,望您指点。QQ交流群:865061230 https://blog.csdn.net/Sirius_hly/article/details/82910979
1.建立存储用户登录日志表
create table `log`(
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(255) DEFAULT NULL,
`userIP` varchar(255) DEFAULT NULL,
`actionClassName` varchar(6000) DEFAULT NULL,
`actionDate` varchar(255) DEFAULT NULL,
`result` varchar(6000) DEFAULT NULL,
PRIMARY KEY(`id`)
)ENGINE=InnoDB AUTO_INCREMENT =1 DEFAULT CHARSET = utf8;
2.添加maven依赖
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.11.1</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.11.1</version>
</dependency>
<!-- 使用数据源 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.14</version>
</dependency>
3.配置拦截器Filter
package com.hly.sirius.filter;
/**
* @author :hly
* @github :github.com/SiriusHly
* @blog :blog.csdn.net/Sirius_hly
* @date :2018/10/2
*/
@WebFilter(filterName = "VisitorFilter",urlPatterns = "/index")
public class VisitorFilter extends OncePerRequestFilter {
private static Logger logger = LogManager.getLogger(VisitorFilter.class);
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
HttpSession session = request.getSession();
String userId = (String) session.getAttribute("userId");
String userIP = request.getRemoteUser();
ThreadContext.put("userId",userId);
ThreadContext.put("userIP",userIP);
System.err.println("登录用户:"+userId);
System.err.println("登录IP:"+userIP);
logger.error("用户:"+userId);
}
}
存取要保存到数据库的值
ThreadContext.put("userIP",userIP);
通过配置文件取得值,保存到数据库
<Column name="userIP" pattern="%X{userIP}"/>
在Application开启Servlet扫描注解
@ServletComponentScan(basePackages = {"com.hly.sirius.filter"})
4.连接数据库配置
package com.hly.sirius.config;
/**
* @author :hly
* @github :github.com/SiriusHly
* @blog :blog.csdn.net/Sirius_hly
* @date :2018/10/2
*/
public class ConnectionFactoryConfig {
private DruidDataSource dataSource;
private static ConnectionFactoryConfig connectionFactoryConfig;
private Connection getConnection() throws SQLException {
System.err.println("实例化");
Properties properties = new Properties();
String user = "root";
String password = "roof";
String url = "jdbc:mysql://localhost:3306/sirius?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true";
String driverClassName = "com.mysql.jdbc.Driver";
properties.put("driverClassName",driverClassName);
properties.put("url",url);
properties.put("username",user);
properties.put("password",password);
try {
dataSource = (DruidDataSource) DruidDataSourceFactory.createDataSource(properties);
} catch (Exception e) {
try {
init();
} catch (Exception e2) {
}
}
return dataSource.getConnection();
}
public static Connection getDatabaseConnection() throws SQLException {
if(connectionFactoryConfig==null){
connectionFactoryConfig = new ConnectionFactoryConfig();
}
return connectionFactoryConfig.getConnection();
}
public void init(){
try {
if (dataSource != null)
dataSource.close();
} catch (Exception e) {
}
}
}
5.配置日志log4j2-spring.xml
<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
<!--添加append="false"日志文件每次都会清空-->
<File name="Sirius" fileName="d:/logs/sirius.log">
<ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="%d{yyyy.MM.dd 'at' HH:mm:ss z} %-5level %class{36} %M() @%L - %msg%n"/>
</File>
<RollingFile name="RollingFile" fileName="d:/logs/siriusLog.log"
filePattern="d:/$${date:yyyy-MM}/logs-%d{MM-dd-yyyy}-%i.siriusLog.gz">
<PatternLayout>
<Pattern>%d [%t] %-5level %logger{36} - %msg%n</Pattern>
</PatternLayout>
<Policies>
<SizeBasedTriggeringPolicy size="20MB"/>
</Policies>
</RollingFile>
<!--保存到数据库配置文件-->
<JDBC name="databaseAppender" tableName="log">
<ConnectionFactory class="com.hly.sirius.config.ConnectionFactoryConfig" method="getDatabaseConnection"/>
<Column name="username" pattern="%X{userId}"/>
<Column name="userIP" pattern="%X{userIP}"/>
<Column name="actionClassName" pattern="%c"/>
<Column name="actionDate" pattern="%d{yyyy-MM-dd hh:mm:ss}"/>
<Column name="result" pattern="%m"/>
</JDBC>
</Appenders>
<Loggers>
<Root level="DEBUG">
<!--匹配每一个appender的名称-->
<AppenderRef ref="Console"/>
<AppenderRef ref="Sirius"/>
<AppenderRef ref="RollingFile"/>
</Root>
<logger name="com.hly.sirius" level="error">
<AppenderRef ref="databaseAppender" level="error"/>
</logger>
</Loggers>
</Configuration>
6.运行程序,数据插入数据库
完整代码
完整代码在笔者github,欢迎访问