您的位置:首页 > 编程语言 > Java开发

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

2016-10-29 16:45 706 查看


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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐