- import java.io.BufferedWriter;
- import java.io.File;
- import java.io.FileWriter;
- import java.io.IOException;
- import java.util.concurrent.ConcurrentLinkedQueue;
- public class GameLogs {
- public final static int insert_item = 0;//
- public final static int update_item = 1;//
- public final static int delete_item = 2;//
- public final static int dummys = 3;// 游戏币
- public final static int moneys = 4;// 元宝
- public final static int leCurrency = 5;//
- public final static int pay = 6;// 充值记录
- public final static int bannedList = 7;// 加还检查日志
- public final static int uplv = 8;// 升级日志
- public final static int login_logout = 9;// 登入登出日志
- public final static int other = 10;
- public final static int runScript = 11;// 脚本日志
- public final static int mapSkip = 12;// 用户跳转场景
- public final static int userState = 13;// 用户状态
- public final static int social = 14;// 社交 1好友 2组队 3家族
- public final static int transaction = 15 ; // 交易
- // 强化成功
- // 强化失败
- // 交易
- // 合成
- // 镶嵌
- // 打孔
- // 卖出
- // 购买
- // 杀死后获取
- // 使用
- // 修理
- // 丢弃
- // 装备
- // 卸下
- // 存入
- // 取出
- private static final int act_count = 16;
- private static String logsPath = Def.APP_ROOT + "/logs/";
- private static ConcurrentLinkedQueue<Log>[] logsList = new ConcurrentLinkedQueue[act_count];
- static {
- for (int i = 0; i < act_count; i++) {
- logsList[i] = new ConcurrentLinkedQueue();
- }
- }
- private static ConcurrentLinkedQueue<Log> logs = new ConcurrentLinkedQueue<Log>();
- /**
- * 增加业务日志
- *
- * @param a
- * 业务动作
- *@param objects
- *@date 2009-6-22
- *@author eric.chan
- */
- public static void logs(int actCount, Object... objects) {
- Log log=logs.poll();
- if(log==null)log=new Log(objects);
- else
- log.setLog(objects);
- switch (actCount) {
- case insert_item://
- logsList[0].offer(log);
- break;
- case update_item://
- logsList[1].offer(log);
- break;
- case delete_item://
- logsList[2].offer(log);
- break;
- case dummys:// 游戏币
- logsList[dummys].offer(log);
- break;
- case moneys:// 元宝
- logsList[moneys].offer(log);
- break;
- case leCurrency://
- logsList[leCurrency].offer(log);
- break;
- case pay:// 充值记录
- logsList[pay].offer(log);
- break;
- case bannedList:// 加检查日志
- logsList[bannedList].offer(log);
- break;
- case uplv:// 升级日志
- logsList[uplv].offer(log);
- break;
- case login_logout:// 登录登出日志
- logsList[login_logout].offer(log);
- break;
- case other:// 其它
- logsList[other].offer(log);
- break;
- case runScript:// 脚本运行日志
- logsList[runScript].offer(log);
- break;
- case mapSkip://场景跳转
- logsList[mapSkip].offer(log);
- break;
- case userState:// 用户状态
- logsList[userState].offer(log);
- break;
- case social://社交 1好友 2组队 3家族
- logsList[social].offer(log);
- break;
- case transaction: // 交易
- logsList[transaction].offer(log);
- break;
- default:
- throw new NullPointerException("not found actCount" + actCount);
- }
- }
- public static void logFlushThread() {
- new LogWorker().start();
- }
- public static void flush() {
- for (int i = 0; i < act_count; i++) {
- File f = new File(logsPath + DateUtils.getNowDate2() + "/" + i);
- if (!f.exists())
- f.getParentFile().mkdirs();
- BufferedWriter bw = null;
- try {
- bw = new BufferedWriter(new FileWriter(f, true));
- StringBuilder sb = new StringBuilder();
- Log obj = null;
- int t = 0;
- ConcurrentLinkedQueue<Log> clq = logsList[i];
- while ((obj = clq.poll()) != null) {
- Object[] objs = obj.objs;
- sb.setLength(0);
- for (Object o : objs) {
- sb.append(o).append('@');
- }
- sb.append(obj.date).append('@');
- sb.append("\\n");
- bw.write(sb.toString());
- obj.clear();
- logs.offer(obj);
- // sb = null;
- t++;
- if (t % 50 == 0) {
- bw.flush();
- }
- }
- bw.flush();
- } catch (IOException e) {
- e.printStackTrace();
- } finally {
- if (bw != null) {
- try {
- bw.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
- }
- }
- private static class Log {
- public Object[] objs;
- public String date = DateUtils.getNowDate3();
- public Log(Object[] o) {
- objs = o;
- }
- public void setLog(Object[] o) {
- objs = o;
- date = DateUtils.getNowDate3();
- }
- public void clear(){
- date=null;
- objs=null;
- }
- }
- public static void main(String[] args) {
- logFlushThread();
- for (int i = 0; i < 100000; i++)
- logs(213123, 123, 14, 234, 312, 412, 31, 4, 23, 123, 12, 3);
- }
- }
- class LogWorker extends Thread {
- public void run() {
- while (Config.threadRunFlag) {
- try {
- GameLogs.flush();
- } catch (Exception e) {
- e.printStackTrace();
- } finally {
- try {
- this.sleep(1000 * 60);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- }
- }
- }
- //该片段来自于http://www.codesnippet.cn/detail/090520133229.html
来源: http://www.codesnippet.cn/detail/090520133229.html