log4j 日志文件存储数据库的解决方案二(Java中写sql语句)

HashMapping.java

package com.panda.core.log.bean;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * Created by Lovell on 26/10/2016.
 */
/*
 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 @@@@        @@        @@       @@@@
 @@@@  @@@@@@@@  @@@@  @@  @@@   @@@
 @@@@  @@@   @@  @@@@  @@  @@@@  @@@
 @@@@  @@@@  @@  @@@@  @@  @@@   @@@
 @@@@        @@        @@       @@@@
 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 */

public class HashMapping {
    private static Logger logger = LoggerFactory.getLogger(HashMapping.class);

    public static final String PLAYER_ID = "name";          // 用户名称
    public static final String PLAYER_NAME = "username";    // 用户名称
    public static final String PLAYER_BEHAVOR = "behavior"; // 用户密码
    public static final String PLAYER_TIME = "time";        // 用户时间
}
PlayerBean.java

package com.panda.core.log.bean;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 玩家
 * Created by Lovell on 26/10/2016.
 */
/*
 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 @@@@        @@        @@       @@@@
 @@@@  @@@@@@@@  @@@@  @@  @@@   @@@
 @@@@  @@@   @@  @@@@  @@  @@@@  @@@
 @@@@  @@@@  @@  @@@@  @@  @@@   @@@
 @@@@        @@        @@       @@@@
 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 */

public class PlayerBean {
    private static Logger logger = LoggerFactory.getLogger(PlayerBean.class);

    private int playerId;

    private String playerName;

    private String behaviour;

    private String time;

    public int getPlayerId() {
        return playerId;
    }

    public void setPlayerId(int playerId) {
        this.playerId = playerId;
    }

    public String getPlayerName() {
        return playerName;
    }

    public void setPlayerName(String playerName) {
        this.playerName = playerName;
    }

    public String getBehaviour() {
        return behaviour;
    }

    public void setBehaviour(String behaviour) {
        this.behaviour = behaviour;
    }

    public String getTime() {
        return time;
    }

    public void setTime(String time) {
        this.time = time;
    }

}

DBAppender.java

package com.panda.core.log.control;

import com.panda.core.log.bean.HashMapping;
import com.panda.core.log.util.LogHelper;
import org.apache.log4j.jdbc.JDBCAppender;
import org.apache.log4j.spi.LoggingEvent;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Hashtable;
import java.util.List;

/**
 * Created by Lovell on 26/10/2016.
 */
/*
 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 @@@@        @@        @@       @@@@
 @@@@  @@@@@@@@  @@@@  @@  @@@   @@@
 @@@@  @@@   @@  @@@@  @@  @@@@  @@@
 @@@@  @@@@  @@  @@@@  @@  @@@   @@@
 @@@@        @@        @@       @@@@
 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 */

public class DBAppender extends JDBCAppender {
    private static Logger logger = LoggerFactory.getLogger(DBAppender.class);

    public List<Object> params = new ArrayList<Object>();
    /**
     * 关闭连接
     *
     * @param connection
     */
    protected void closeConnection(Connection connection) {
        LogHelper.getInstance().dbService.evictConnection(connection);
    }

    /**c
     * 执行sql语句
     *
     * @param sql
     * @throws SQLException
     */
    @Override
    protected void execute(String sql) throws SQLException {
        boolean flag = false;
        int end = sql.lastIndexOf(")");
        String sqls = sql.substring(0, end + 1);
        String beanname = sql.substring(end + 1);
        if (beanname.equals("PlayerBean")) {             // 如果类名为PlayerBean
            // 存入数据库
            flag = LogHelper.getInstance().updatePlayer(sqls, params);
        }
        logger.info(!flag ? "insert fail!" : "insert successful!");
    }

    /**
     * 获取连接
     *
     * @return
     * @throws SQLException
     */
    @Override
    protected Connection getConnection() throws SQLException {
        if (connection == null) {
            connection = LogHelper.getInstance().dbService.getConnection();
        }
        return connection;
    }

    /**
     * 获取Log声明
     *
     * @param event
     * @return
     */
    @Override
    protected String getLogStatement(LoggingEvent event) {
        StringBuffer stringBuffer = new StringBuffer();
        Hashtable hashtable = (Hashtable) event.getMessage();

        String table = "t_login";
        String playerId = "12";
        String playerName = "lovell";
        String behavior = "test";
        String time = "123456";

        logger.info("存入MySQL数据库表名为【{}】,用户ID[{}],用户名【{}】,用户密码【{}】" + table + playerId, playerName, behavior, time);
        String sql = null;
        if ((hashtable.get("beanname")).equals("PlayerBean")) { // 如果类名为UserBean
            sql = String.format("insert into %s (playerId, playerName, behavior, time) values(?, ?, ?, ?)",
                    table);

            params.add(hashtable.get(HashMapping.PLAYER_ID));       // 昵称
            params.add(hashtable.get(HashMapping.PLAYER_NAME));     // 玩家等级
            params.add(hashtable.get(HashMapping.PLAYER_BEHAVOR));  // 行为
            params.add(hashtable.get(HashMapping.PLAYER_TIME));     // 时间

            return sql + hashtable.get("beanname");
        }
        return sql;
    }
}
GetObject.java

package com.panda.core.log.dao;

import com.panda.core.log.bean.PlayerBean;
import org.apache.log4j.PropertyConfigurator;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Hashtable;

/**
 * Created by Lovell on 26/10/2016.
 */
/*
 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 @@@@        @@        @@       @@@@
 @@@@  @@@@@@@@  @@@@  @@  @@@   @@@
 @@@@  @@@   @@  @@@@  @@  @@@@  @@@
 @@@@  @@@@  @@  @@@@  @@  @@@   @@@
 @@@@        @@        @@       @@@@
 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 */

public class GetObject {
    private static Logger logger = LoggerFactory.getLogger(GetObject.class);

    private PlayerBean playerBean;             // 玩家对象
    private SimpleDateFormat simpleDateFormat;

    /**
     * 保存对象
     */
    public PlayerBean insertInfo(int playerId, String playerName, String behaviour) {
        playerBean = new PlayerBean();
        playerBean.setPlayerId(playerId);
        playerBean.setPlayerName(playerName);
        playerBean.setBehaviour(behaviour);
        return playerBean;
    }

    public PlayerBean getPlayerBean() {
        return playerBean;
    }

    public void setPlayerBean(PlayerBean playerBean) {
        this.playerBean = playerBean;
    }

    public SimpleDateFormat getSimpleDateFormat() {
        return simpleDateFormat;
    }

    public void setSimpleDateFormat(SimpleDateFormat simpleDateFormat) {
        this.simpleDateFormat = simpleDateFormat;
    }

    // bean key-value
    public void getMethod(Object obj) {
        // 简单的日期格式
        simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");
        PropertyConfigurator.configure("log4j.properties");

        Hashtable hashtable = new Hashtable();
        hashtable.clear();
        if (obj instanceof PlayerBean) {
            hashtable.put("playerId", playerBean.getPlayerId());              // 用户名
            hashtable.put("playerName", playerBean.getPlayerName());          // 密码
            hashtable.put("behaviour", playerBean.getBehaviour());            // 时间日期
            hashtable.put("time", simpleDateFormat.format(new Date()));       // 时间
            hashtable.put("beanname", "PlayerBean");                          // 类名
        }
        logger.info(String.valueOf(hashtable));
    }
}
LogDao.java

package com.panda.core.log.dao;

import com.panda.core.db.dao.Dao;
import com.panda.core.db.impl.DBService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.IOException;
import java.sql.SQLException;
import java.util.List;

/**
 * 日志接口类
 * Created by Lovell on 26/10/2016.
 */
/*
 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 @@@@        @@        @@       @@@@
 @@@@  @@@@@@@@  @@@@  @@  @@@   @@@
 @@@@  @@@   @@  @@@@  @@  @@@@  @@@
 @@@@  @@@@  @@  @@@@  @@  @@@   @@@
 @@@@        @@        @@       @@@@
 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 */

public class LogDao {
    private static Logger logger = LoggerFactory.getLogger(LogDao.class);

    private static final String LOG_CONFIG_FILE = "/log4j.xml";

    public DBService dbService;
    public Dao dao;

    /**
     * 设置MySQL服务器配置文件路径
     *
     * @param fileName
     */
    public void setDBConfigFileName(final String fileName) {
        if (fileName == null || fileName.length() == 0) {
            return;
        }
        dbService = new DBService(fileName);
    }

    /**
     * 以配置文件启动数据库
     *
     * @param fileName
     */
    public void startDB(final String fileName) {
        dbService.setConfigFileName(fileName);
        logger.info("Start DB.");
    }

    /**
     * 停止MySQL
     */
    public void stopDB() throws IOException, SQLException {
        dbService.stop();
        logger.info("MySQL was stopped.");
    }

    /**
     * 更新玩家数据 增删改
     *
     * @param sql
     * @param params
     * @return
     * @throws SQLException
     */
    public boolean updatePlayer(String sql, List<Object> params) throws SQLException {
        return dao.updateByPreparedStatement(sql, params);
    }
}
LogHelper.java

package com.panda.core.log.util;

import com.panda.core.log.dao.LogDao;

/**
 * 日志操作接口
 * Created by Lovell on 27/10/2016.
 */
/*
 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 @@@@        @@        @@       @@@@
 @@@@  @@@@@@@@  @@@@  @@  @@@   @@@
 @@@@  @@@   @@  @@@@  @@  @@@@  @@@
 @@@@  @@@@  @@  @@@@  @@  @@@   @@@
 @@@@        @@        @@       @@@@
 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 */

public class LogHelper extends LogDao {

    private static LogHelper logHelper;
    public static LogHelper getInstance() {
        if (logHelper == null) {
            logHelper = new LogHelper();
        }
        return logHelper;
    }
}


Tools.java

package com.panda.core.tools;

import org.apache.log4j.PropertyConfigurator;
import org.apache.log4j.xml.DOMConfigurator;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.w3c.dom.Document;
import org.xml.sax.SAXException;

import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import java.io.File;
import java.io.FileInputStream;
import java.net.URL;
import java.net.URLDecoder;
import java.util.Properties;
import java.util.Random;

/**
 * 工具类,全静态,方便共享使用
 */
public class Tools {

    private static Random random = new Random();

    /**
     * 闭合随机数
     *
     * @param nMin 最小值(包含)
     * @param nMax 最大值(包含)
     * @return
     */
    public static int RandomInt(int nMin, int nMax) {
        // 为能够随机到最大值,这里需要+1,nextInt(N)的随机数不包含N
        return random.nextInt(nMax - nMin + 1) + nMin;
    }

    /**
     * 获取jar运行时路径
     *
     * @return
     */
    public static String getPath() {
        URL url = Tools.class.getProtectionDomain().getCodeSource().getLocation();
        String filePath = null;
        try {
            filePath = URLDecoder.decode(url.getPath(), "utf-8");// 转化为utf-8编码
        } catch (Exception e) {
            e.printStackTrace();
        }
        if (filePath.endsWith(".jar")) {// 可执行jar包运行的结果里包含".jar"
            // 截取路径中的jar包名
            filePath = filePath.substring(0, filePath.lastIndexOf("/") + 1);
        }

        File file = new File(filePath);

        filePath = file.getAbsolutePath();//得到windows下的正确路径
        return filePath;
    }

    public static Logger getFileLogger(String strFileName, Class<?> clazz) {
        File file = new File(getPath() + strFileName);
        Logger logger = null;
        try {
            FileInputStream istream = new FileInputStream(file);
            Properties props = new Properties();
            props.load(istream);
            PropertyConfigurator.configure(props);
            logger = LoggerFactory.getLogger(clazz);

        } catch (java.io.IOException e) {
            e.printStackTrace();
        }
        return logger;
    }

    public static Logger getDBLogger(String strFileName, Class<?> clazz) {
        File file = new File(getPath() + strFileName);
        Logger logger = null;
        try {
            FileInputStream istream = new FileInputStream(file);
            // 判断文件是xml文件还是properties配置文件
            if (strFileName.endsWith(".xml")) {
                Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(istream);
                DOMConfigurator.configure(doc.getDocumentElement());
            }
        } catch (java.io.IOException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            e.printStackTrace();
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        }
        return logger;
    }
}
LogDaoTest.java

package com.panda.core.log;

import com.panda.core.log.bean.PlayerBean;
import com.panda.core.log.dao.GetObject;
import com.panda.core.log.util.LogHelper;
import com.panda.core.tools.Tools;
import org.junit.Test;
import org.slf4j.Logger;

/**
 * Created by Lovell on 26/10/2016.
 */
/*
 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 @@@@        @@        @@       @@@@
 @@@@  @@@@@@@@  @@@@  @@  @@@   @@@
 @@@@  @@@   @@  @@@@  @@  @@@@  @@@
 @@@@  @@@@  @@  @@@@  @@  @@@   @@@
 @@@@        @@        @@       @@@@
 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 */

public class LogDaoTest {
    private static Logger logger = Tools.getDBLogger("log4j.xml", LogDaoTest.class);

    @Test
    public void test1() throws Exception {
        // 启动数据库
        LogHelper.getInstance().startDB("log4jdb.properties");

        // 往数据库中插入数据
        GetObject getObject = new GetObject();
        PlayerBean playerBean = getObject.insertInfo(007, "lovell", "消费了5金币");  // player中插入一行数据
        getObject.getMethod(playerBean);
    }
}

配置文件:

log4j.properties

# define
Log.Location = /usr/local/var/logs
Log.ConversionPattern=[%d{ISO8601}]%t %p [%c] - %-90m %l %n

# set log levels
log4j.rootLogger = INFO, stdout, D, E, db
log4j.logger.monitorLogger = INFO,monitorAppender
log4j.additivity.monitorLogger=false

# output to console
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = ${Log.ConversionPattern}

# output to monitor.log
log4j.appender.monitorAppender=org.apache.log4j.DailyRollingFileAppender
log4j.appender.monitorAppender.File= ${Log.Location}/monitor.log
log4j.appender.monitorAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.monitorAppender.layout.ConversionPattern=%m%n
log4j.appender.monitorAppender.DatePattern='.'yyyy-MM-dd-HH
log4j.appender.monitorAppender.BufferedIO = true
log4j.appender.monitorAppender.BufferSize = 8192

# output INFO to info.log
log4j.appender.D =org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = ${Log.Location}/info.log
log4j.appender.D.Append = true
log4j.appender.D.Threshold = INFO
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern =${log.conversion.pattern}

# output ERROR to error.log
log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
log4j.appender.E.File = ${Log.Location}/error.log
log4j.appender.E.Append = true
log4j.appender.E.Threshold = ERROR
log4j.appender.E.layout = org.apache.log4j.PatternLayout
log4j.appender.E.layout.ConversionPattern =${Log.ConversionPattern}

log4j.logger.com.google = ERROR
log4j.logger.net.rubyeye = ERROR

# mysql jdbc
log4j.appender.db=control.DBAppender
log4j.appender.db.driver=com.mysql.jdbc.Driver
log4j.appender.db.URL=jdbc:mysql://192.168.199.132:3306/log?useUnicode=true&characterEncoding=UTF-8&useSSL=false
log4j.appender.db.username=root
log4j.appender.db.password=root
log4j.appender.db.layout=org.apache.log4j.PatternLayout
log4j.appender.db.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n %L
log4j.xml

<?xml version="1.0" encoding="UTF-8"?>
<log4j:configuration debug="true" xmlns:log4j="http://jakarta.apache.org/log4j/">

    <!--# output to console-->
    <appender name="stdout"
              class="org.apache.log4j.ConsoleAppender">
        <!--<target class="System.out"/>-->
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="[%d{ISO8601}]%t %p [%c] - %-90m %l %n" />
        </layout>
    </appender>

    <!--# output INFO to info.log-->
    <appender name="D" class="org.apache.log4j.DailyRollingFileAppender">
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="[%d{ISO8601}]%t %p [%c] - %-90m %l %n" />
        </layout>
        <param name="File" value="/usr/local/var/logs/info.log" />
        <param name="Append" value="true"/>
        <param name="Threshold" value="INFO"/>
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="[%d{ISO8601}]%t %p [%c] - %-90m %l %n" />
        </layout>

    </appender>

    <!--# output ERROR to error.log-->
    <appender name="E"
              class="org.apache.log4j.DailyRollingFileAppender">
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="[%d{ISO8601}]%t %p [%c] - %-90m %l %n" />
        </layout>

        <param name="File" value="/usr/local/var/logs/error.log" />
        <param name="Append" value="true"/>
        <param name="Threshold" value="ERROR"/>
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="[%d{ISO8601}]%t %p [%c] - %-90m %l %n" />
        </layout>
    </appender>

    <!--# output to monitor.log-->
    <appender name="monitorAppender" class="org.apache.log4j.DailyRollingFileAppender">
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%m%n" />
        </layout>
        <param name="DatePattern" value="'.'yyyy-MM-dd-HH" />
        <param name="File" value="/usr/local/var/logs/monitor.log" />
        <param name="BufferedIO" value="true" />
        <param name="BufferSize" value="8192" />
    </appender>
    <!--# async -->
    <appender name="async" class="org.apache.log4j.AsyncAppender">
        <appender-ref ref="monitorAppender"/>
    </appender>

    <!--# jdbc-->
    <appender name="db" class= "control.DBAppender">
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n %L"/>
        </layout>
        <param name="driver" value="com.mysql.jdbc.Driver"/>
        <param name="URL" value="jdbc:mysql://192.168.199.132:3306/log?useUnicode=true,characterEncoding=UTF-8,useSSL=false"/>
        <param name="user" value="root"/>
        <param name="password" value="root"/>
    </appender>

    <!--# set priority-->
    <root>
        <priority value="error" />
        <appender-ref ref="stdout" />
    </root>


    <category name="monitorLogger" additivity="false">
        <priority value="info" />
        <appender-ref ref="async" />
    </category>
</log4j:configuration>
log4jdb.properties

db_url = 192.168.199.132
db_port = 3306
db_name = mind
db_max_conn = 100
db_username = root
db_password = root

来自:http://blog.csdn.net/langzi7758521/article/details/52813932

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

VCHH

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值