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
相关文章推荐
- log4j 日志文件存储数据库的解决方案一(配置文件中写sql语句)
- java实现将资源文件转化成sql语句导入数据库
- SQL语句创建数据库和日志文件
- Java程序中避免使用字符串拼装SQL语句的之解决方案⑴-properties属性文件的使用
- 取数据库MDF文件存储路径SQL语句
- SQL语句修改数据库文件及日志文件增量
- 在一个千万级的数据库查寻中,如何提高查询效率?分别说出在数据库设计、SQL语句、java等层面的解决方案。【转】
- log4j自定义日志等级;数据库缓冲池存储到数据库;数据库和输出到文件终端分离;发送邮件
- log4j.properties(java日志文件)语法语句解析,什么意思,使用方法举例
- Java中获取Log4j日志文件,Mybatis 的ScriptRunner执行带pl/sql的 代码块脚本
- 在一个千万级的数据库查寻中,如何提高查询效率?分别说出在数据库设计、SQL语句、java等层面的解决方案
- 在一个千万级的数据库查寻中,如何提高查询效率?分别说出在数据库设计、SQL语句、java等层面的解决方案。
- 将数据库日志文件压缩到1M的sql语句
- 在一个千万级的数据库查寻中,如何提高查询效率?分别说出在数据库设计、SQL语句、java等层面的解决方案。
- sql server 2005 压缩实例下所有数据库文件及日志文件 语句
- MS Sql Server查询磁盘的可用空间,数据库数据文件及日志文件的大小及利用率
- sql语句查看SQL Server 数据库的事务日志
- log4j日志文件的相对位置设置的完美解决方案
- sql 语句删除数据库日志
- 数据库操作_连接SQL Server数据库示例;连接ACCESS数据库;连接到 Oracle 数据库示例;SqlCommand 执行SQL命令示例;SqlDataReader 读取数据示例;使用DataAdapter填充数据到DataSet;使用DataTable存储数据库表;将数据库数据填充到 XML 文件;10 使用带输入参数的存储过程;11 使用带输入、输出参数的存储过程示;12 获得数据库中表的数目和名称;13 保存图片到SQL Server数据库示例;14 获得插入记录标识号;Exce