1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171
|
// Copyright Hugh Perkins 2006, 2009, Robin Vobruba 2008
// hughperkins@gmail.com http://manageddreams.com
//
// This program is free software; you can redistribute it and/or modify it
// under the terms of the GNU General Public License as published by the
// Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful, but
// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
// more details.
//
// You should have received a copy of the GNU General Public License along
// with this program in the file licence.txt; if not, write to the
// Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-
// 1307 USA
// You can find the licence also on the web at:
// http://www.opensource.org/licenses/gpl-license.php
//
// ======================================================================================
//
// file logging functions
// ====================
//
// just call WriteLog( "my message" ) to write to the log
// log appears in same directory as dll (same directory as tasclient.exe), named "csharpai_teamX.log"
// where X is team number, in case we are running multiple AIs (one per team)
//
// Migrated to be based heavily on Robin Vobruba's code that uses the
// Java Logger class, following migration to Java, by Hugh Perkins
// This makes it a bit more standard, and may allow our static classes to
// actually be static, and still log things.
package hughai.utils;
import java.io.*;
import java.text.*;
import java.util.Date;
import java.util.logging.*;
import javax.management.RuntimeErrorException;
import hughai.*;
public class LogFile
{
public boolean AutoFlushOn = true;
Logger logger = Logger.getLogger( "general" ); // note: name may be migrated
// to something like this.getClass().getName() in the future
// PrintWriter printWriter;
PlayerObjects playerObjects;
//TimeHelper timeHelper;
public LogFile( PlayerObjects playerObjects ) {
this.playerObjects = playerObjects;
}
public LogFile Init( String logfilepath )
{
try {
System.out.println("logfile init: [" + logfilepath + "]");
// printWriter = new PrintWriter( logfilepath );
setupLogger( logfilepath );
//CSAI.GetInstance().RegisterVoiceCommand( "flushlog", new CSAI.VoiceCommandHandler( this.VCFlushLog ) );
} catch( Exception e ) {
// well, we're kind of screwed if we can't use the logger,
// so just print to stdout?
e.printStackTrace();
throw new RuntimeException( e ); // and throw up the stack ...
}
return this;
}
void setupLogger( String logfilepath ) throws Exception {
FileHandler fileHandler = new FileHandler( logfilepath );
logger.addHandler( fileHandler );
StdInfoHandler consoleHandler = new StdInfoHandler();
logger.addHandler( consoleHandler );
for( Handler handler : logger.getHandlers() ) {
handler.setFormatter( new AILogFormatter() );
}
logger.setUseParentHandlers( false );
}
public void Flush()
{
// printWriter.flush();
for( Handler handler : logger.getHandlers() ) {
handler.flush();
}
}
// arguably we shouldnt auto-flush. because it slows writes, up to you
public void WriteLine( Object message )
{
//sw.WriteLine(DateTime.Now.toString("hh:mm:ss.ff") + ": " + message);
// printWriter.println(playerObjects.getTimeHelper().GetCurrentGameTimeString() + ": " + message);
// System.out.println(playerObjects.getTimeHelper().GetCurrentGameTimeString() + ": " + message);
logger.info( "" + message );
if( AutoFlushOn )
{
Flush();
// printWriter.flush();
}
//sw.Flush();
}
public void writeLine( Object message ) {
WriteLine( message );
}
public void writeStackTrace( Exception e ) {
String stacktrace = Formatting.exceptionToStackTrace( e );
WriteLine( stacktrace );
}
public void Shutdown()
{
// printWriter.flush();
// printWriter.close();
Flush();
LogManager.getLogManager().reset(); // hopefully prevents memory leaking?
}
// heavily based on MyCustomLogFormatter, by Robin Vobruba
private class AILogFormatter extends java.util.logging.Formatter {
// private DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss.SSS");
public String format(LogRecord record) {
StringBuffer sb = new StringBuffer();
// Date date = new Date(record.getMillis());
// sb.append(dateFormat.format(date));
sb.append( playerObjects.getTimeHelper().GetCurrentGameTimeString() );
sb.append(" ");
sb.append(record.getLevel().getName());
sb.append(": ");
sb.append(formatMessage(record));
sb.append("\n");
return sb.toString();
}
}
// created by Hugh Perkins 2009, so logging just goes to stdout, rather
// than to stderr, and black intead of bright red...
static class StdInfoHandler extends ConsoleHandler {
public StdInfoHandler() {
super();
setOutputStream( System.out );
}
}
}
|