SpringBoot2.0之Log4j2日志写入数据库

版权声明:自由转载-非商用-保持署名,觉得此文有用的,不嫌麻烦的话,就留个言,或者点个赞吧,如果觉得文章有错误,望您指点。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.连接数据库配置

log4j2官方文档

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,欢迎访问

猜你喜欢

转载自blog.csdn.net/Sirius_hly/article/details/82910979
今日推荐