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://yuncode.net |
|