001 package toolbus.logging; 002 003 import java.io.File; 004 import java.io.FileOutputStream; 005 import java.io.IOException; 006 import java.io.PrintWriter; 007 008 /** 009 * Logger implementation that writes to a file. 010 * 011 * @author Arnold Lankamp 012 */ 013 public class FileLogger implements ILogger{ 014 private final static String endLineCharacter = System.getProperty("line.separator"); 015 016 private final int level; 017 018 private final PrintWriter writer; 019 020 private boolean timestamp = false; 021 022 /** 023 * Default constructor. Inititalizes this logger with the default log level (WARNING). 024 */ 025 FileLogger(){ 026 this(ILogger.WARNING); 027 } 028 029 /** 030 * Constructor. Initialized this logger with the given log level. 031 * 032 * @param level 033 * The log level to initialize this logger with. 034 */ 035 FileLogger(int level){ 036 super(); 037 038 this.level = level; 039 040 try{ 041 // TODO make configurable. 042 writer = new PrintWriter(new FileOutputStream(new File("./toolbus.log"), true)); 043 }catch(IOException ioex){ 044 throw new RuntimeException(ioex); 045 } 046 } 047 048 /** 049 * Method for checking if we should log a message. This depends on the log level and the given 050 * log level. 051 * 052 * @param loglevel 053 * The log level of the message. 054 * @return True if we should log the message with the given log level, false otherwise. 055 */ 056 private boolean shouldLog(int loglevel){ 057 return (this.level >= loglevel); 058 } 059 060 /* 061 * @see toolbus.logging.ILogger#setTimestamp(boolean) 062 */ 063 public void setTimestamp(boolean on) { 064 timestamp = on; 065 } 066 067 068 /** 069 * @see ILogger#log(String, int) 070 */ 071 public void log(String message, int loglevel){ 072 if(shouldLog(loglevel)){ 073 synchronized(writer){ 074 if(timestamp){ 075 writer.print("["); 076 writer.print(CommandLineLogger.getFormattedDateTime()); 077 writer.print("] - "); 078 } 079 writer.print(CommandLineLogger.getLogLevelString(loglevel)); 080 writer.print(" - "); 081 writer.print(message); 082 writer.print(endLineCharacter); 083 084 writer.flush(); 085 } 086 } 087 } 088 089 /** 090 * @see ILogger#log(String, Throwable, int) 091 */ 092 public void log(String message, Throwable throwable, int loglevel){ 093 if(shouldLog(loglevel)){ 094 synchronized(writer){ 095 if(timestamp){ 096 writer.print("["); 097 writer.print(CommandLineLogger.getFormattedDateTime()); 098 writer.print("] - "); 099 } 100 writer.print(CommandLineLogger.getLogLevelString(loglevel)); 101 writer.print(" - "); 102 writer.print(message); 103 writer.print(endLineCharacter); 104 105 throwable.printStackTrace(writer); 106 writer.print(endLineCharacter); 107 108 writer.flush(); 109 } 110 } 111 } 112 113 /** 114 * Closes this logger. 115 */ 116 public void finalize(){ 117 writer.close(); 118 } 119 }