package railo.runtime.tag;
import java.io.IOException;
import railo.commons.io.log.LogConsole;
import railo.commons.io.log.LogResource;
import railo.commons.io.res.Resource;
import railo.commons.lang.StringUtil;
import railo.runtime.config.Config;
import railo.runtime.exp.ApplicationException;
import railo.runtime.exp.PageException;
import railo.runtime.ext.tag.TagImpl;
import railo.runtime.op.Caster;
import railo.runtime.tag.util.DeprecatedUtil;
/**
* Writes a message to a log file.
*
*
*
**/
public final class Log extends TagImpl {
private final static short LOG_APPLICATION=10;
private final static short LOG_SCHEDULER=11;
private final static short LOG_CONSOLE=12;
/** If you omit the file attribute, specifies the standard log file in which to write the message.
** Ignored if you specify a file attribute */
private short log=LOG_APPLICATION;
/** The message text to log. */
private String text;
/** The type or severity of the message. */
private short type=railo.commons.io.log.Log.LEVEL_INFO;
/** */
private String file;
/** Specifies whether to log the application name if one has been specified in a application tag. */
private boolean application;
private String charset=null;
@Override
public void release() {
super.release();
log=LOG_APPLICATION;
type=railo.commons.io.log.Log.LEVEL_INFO;
file=null;
application=false;
charset=null;
}
/** set the value log
* If you omit the file attribute, specifies the standard log file in which to write the message.
* Ignored if you specify a file attribute
* @param log value to set
* @throws ApplicationException
**/
public void setLog(String log) throws ApplicationException {
if(StringUtil.isEmpty(log,true)) return;
log=log.toLowerCase().trim();
if(log.equals("application")) this.log=LOG_APPLICATION;
else if(log.equals("scheduler")) this.log=LOG_SCHEDULER;
else if(log.equals("console")) this.log=LOG_CONSOLE;
else
throw new ApplicationException("invalid value for attribute log ["+log+"]","valid values are [application, scheduler,console]");
}
/** set the value text
* The message text to log.
* @param text value to set
**/
public void setText(String text) {
this.text=text;
}
/** set the value type
* The type or severity of the message.
* @param type value to set
* @throws ApplicationException
**/
public void setType(String type) throws ApplicationException {
type=type.toLowerCase().trim();
if(type.equals("information")) this.type=railo.commons.io.log.Log.LEVEL_INFO;
else if(type.equals("info")) this.type=railo.commons.io.log.Log.LEVEL_INFO;
else if(type.equals("warning")) this.type=railo.commons.io.log.Log.LEVEL_WARN;
else if(type.equals("warn")) this.type=railo.commons.io.log.Log.LEVEL_WARN;
else if(type.equals("error")) this.type=railo.commons.io.log.Log.LEVEL_ERROR;
else if(type.startsWith("fatal")) this.type=railo.commons.io.log.Log.LEVEL_FATAL;
else if(type.startsWith("debug")) this.type=railo.commons.io.log.Log.LEVEL_DEBUG;
else
throw new ApplicationException("invalid value for attribute type ["+type+"]",
"valid values are [information,warning,error,fatal,debug]");
}
/** set the value time
* Specifies whether to log the system time.
* @param time value to set
* @throws ApplicationException
**/
public void setTime(boolean useTime) throws ApplicationException {
if(useTime) return;
DeprecatedUtil.tagAttribute(pageContext,"Log", "time");
throw new ApplicationException("attribute [time] for tag [log] is deprecated, only the value true is allowed");
}
/** set the value file
*
* @param file value to set
* @throws ApplicationException
**/
public void setFile(String file) throws ApplicationException {
if(StringUtil.isEmpty(file))return;
if(file.indexOf('/')!=-1 || file.indexOf('\\')!=-1)
throw new ApplicationException("value ["+file+"] from attribute [file] at tag [log] can only contain a filename, file separators like [\\/] are not allowed");
if(!file.endsWith(".log"))file+=".log";
this.file=file;
}
/** set the value date
* Specifies whether to log the system date.
* @param date value to set
* @throws ApplicationException
**/
public void setDate(boolean useDate) throws ApplicationException {
if(useDate) return;
DeprecatedUtil.tagAttribute(pageContext,"Log", "date");
throw new ApplicationException("attribute [date] for tag [log] is deprecated, only the value true is allowed");
}
/** set the value thread
* Specifies whether to log the thread ID. The thread ID identifies which internal service thread logged a
* message. Since a service thread normally services a CFML page request to completion, then moves on to
* the next queued request, the thread ID serves as a rough indication of which request logged a message.
* Leaving thread IDs turned on can help diagnose patterns of server activity.
* @param thread value to set
* @throws ApplicationException
**/
public void setThread(boolean thread) throws ApplicationException {
if(thread) return;
DeprecatedUtil.tagAttribute(pageContext,"Log", "thread");
throw new ApplicationException("attribute [thread] for tag [log] is deprecated, only the value true is allowed");
}
/** set the value application
* Specifies whether to log the application name if one has been specified in a application tag.
* @param application value to set
**/
public void setApplication(boolean application) {
this.application=application;
}
@Override
public int doStartTag() throws PageException {
railo.commons.io.log.Log logger;
Config config =pageContext.getConfig();
if(file==null) {
if(log==LOG_SCHEDULER)logger=config.getScheduleLogger();
else if(log==LOG_CONSOLE)logger=LogConsole.getInstance(config, railo.commons.io.log.Log.LEVEL_INFO);
else logger=config.getApplicationLogger();
}
else {
if(charset==null) charset=pageContext.getConfig().getResourceCharset();
Resource logDir=config.getConfigDir().getRealResource("logs");
if(!logDir.exists())logDir.mkdirs();
try {
Resource f = logDir.getRealResource(file);
logger=new LogResource(f,railo.commons.io.log.Log.LEVEL_INFO,charset);
} catch (IOException e) {
throw Caster.toPageException(e);
}
}
String contextName = pageContext.getApplicationContext().getName();
if(contextName==null || !application)contextName="";
logger.log(type,contextName,text);
//logger.write(toStringType(type),contextName,text);
return SKIP_BODY;
}
/**
* @param charset the charset to set
*/
public void setCharset(String charset) {
if(StringUtil.isEmpty(log,true)) return;
this.charset = charset;
}
}