log4j.properties是定义日志信息的优先级,日志信息的输出目的地,日志信息的输出格式的文件。
现在项目上有两个问题:
1.因为每个系统都是使用默认的log4j.properties这个名字来定义日志文件。当多个系统发布到同一台服务器上的时候,就会出现每次只能放一个系统的log4j.properties文件,几个系统同时运行的时候,LOG就出力的混淆在一起。
为了避免这个问题,需要把log4j.properties的名字改一改。让每个系统都拥有自己的log4j.properties文件。
下面以系统xiaoyao为例来说明。
properties文件的名字变更为:xiaoyaolog4j.properties
xiaoyaolog4j.properties的内容:
2.系统的xiaoyaolog4j.properties不能独立于系统之外,必须打在EAR之内。
这次作了改进,xiaoyaolog4j.properties可以不用在EAR之内,只需要放在文件系统路径下就可以了。
例如在我的机器上可以放在以下路径:
改进之处就是在LOG管理的Class里加入了以下代码:
改进后的整个Class代码如下:
还可以采取以下这种方式:
这种方式xiaoyaolog4j.properties只能放在服务器的profiles下,在我的机器上如下:
这种不如第一种灵活度大,但是这种更严谨,因为放在服务器级别,对所有的发布到这个服务器的系统都是可见的,不安全。
现在项目上有两个问题:
1.因为每个系统都是使用默认的log4j.properties这个名字来定义日志文件。当多个系统发布到同一台服务器上的时候,就会出现每次只能放一个系统的log4j.properties文件,几个系统同时运行的时候,LOG就出力的混淆在一起。
为了避免这个问题,需要把log4j.properties的名字改一改。让每个系统都拥有自己的log4j.properties文件。
下面以系统xiaoyao为例来说明。
properties文件的名字变更为:xiaoyaolog4j.properties
xiaoyaolog4j.properties的内容:
#####################
# File Appender
#####################
log4j.category.xiaoyao=INFO, xiaoyao
log4j.appender.xiaoyao=org.apache.log4j.DailyRollingFileAppender
log4j.appender.xiaoyao.Encoding=UTF-8
log4j.appender.xiaoyao.File=${user.install.root}/logs/cas.log
log4j.appender.xiaoyao.DatePattern='.'yyyyMM
log4j.appender.xiaoyao.Append=true
log4j.appender.xiaoyao.layout=org.apache.log4j.PatternLayout
log4j.appender.xiaoyao.layout.ConversionPattern=%n%d{yyyy/MM/dd HH:mm:ss.SSS} %p %t %c %m%n
2.系统的xiaoyaolog4j.properties不能独立于系统之外,必须打在EAR之内。
这次作了改进,xiaoyaolog4j.properties可以不用在EAR之内,只需要放在文件系统路径下就可以了。
例如在我的机器上可以放在以下路径:
C:\Program Files\IBM\SDP70\runtimes\base_v61\profiles\AppSrv01\properties
或者
C:\Program Files\IBM\SDP70\runtimes\base_v61\properties
改进之处就是在LOG管理的Class里加入了以下代码:
static{
try {
String doubleentryLogFile = AxaProperties.getInstance().getProperty( ConstantUtil.LOG_PROPERTY_FILE );
PropertyConfigurator.configure( ClassLoader.getSystemResource(doubleentryLogFile) );
} catch (Exception e) {
e.printStackTrace();
}
}
改进后的整个Class代码如下:
/*
* XiaoyaoLog.java
* ======================
*
* Logの管理を行うクラス
*
* @author Hengzhang.Xu (Accenture), 2008/04/24
*
* @version 1.0
*
*/
import java.sql.CallableStatement;
import java.util.ListIterator;
import jp.co.axa.life.ajax.db.SqlParamList;
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;
public final class XiaoyaoLog {
static{
try {
String doubleentryLogFile = AxaProperties.getInstance().getProperty( ConstantUtil.LOG_PROPERTY_FILE );
PropertyConfigurator.configure( ClassLoader.getSystemResource(doubleentryLogFile) );
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* LogError
*
* ======================
*
* Error情報をログファイルに出力する。
*
* @param userID
* ユーザーID
* @param exception
* エクセプション。
*/
public static void LogError(String userID, Exception exception) {
// classの名前を取得
StackTraceElement stackTrace = (new Throwable()).getStackTrace()[1];
String className = stackTrace.getClassName();
// Loggerを定義する。
Logger logger = Logger.getLogger(className);
// Logを出す。
logger.error(userID, exception);
}
/**
* LogInfo
*
* ======================
*
* Execute情報をログファイルに出力する。
*
* @param userID
* ユーザ名
*
*/
public static void LogInfo(String userID) {
// classの名前とmethodの名前を取得
StackTraceElement stackTrace = (new Throwable()).getStackTrace()[1];
String className = stackTrace.getClassName();
String methodName = stackTrace.getMethodName();
// Loggerを定義する。
Logger logger = Logger.getLogger(className);
// ログに出力のメセッジの形式を定義する。
String message = userID + ConstantUtil.SPACE_HANKAKU
+ ConstantUtil.EXECUTE + methodName;
// Logを出す。
logger.info(message);
}
/**
* LogSQLAndParam
*
* ======================
*
* SQL文とSQLのParameterリストに内容ファイルに出力する。
*
* @param userID
* ユーザーID
* @param sql
* SQL文。
* @param state
* SQLのCallableStatement(ない場合、nullにする)。
*/
public static void LogSQLAndParam(String userID, String sql,
CallableStatement state) throws Exception {
// classの名前を取得
StackTraceElement stackTrace = (new Throwable()).getStackTrace()[1];
String className = stackTrace.getClassName();
// Loggerを定義する。
Logger logger = Logger.getLogger(className);
// ログに出力のSQL文を定義する。
String messageSQL = userID + ConstantUtil.SPACE_HANKAKU
+ ConstantUtil.LOG_ENTER + ConstantUtil.LOG_SQL + sql;
// Logを出す。
logger.info(messageSQL);
}
/**
* LogSQLAndParam
*
* ======================
*
* SQL文とSQLのParameterリストに内容ファイルに出力する。
*
* @param userID
* ユーザーID
* @param sql
* SQL文。
* @param plist
* SQLのParameterリスト(ない場合、nullにする)。
*/
public static void LogSQLAndParam(String userID, String sql,
SqlParamList plist) {
// classの名前を取得
StackTraceElement stackTrace = (new Throwable()).getStackTrace()[1];
String className = stackTrace.getClassName();
// Loggerを定義する。
Logger logger = Logger.getLogger(className);
// ログに出力のSQL文を定義する。
String messageSQL = userID + ConstantUtil.SPACE_HANKAKU
+ ConstantUtil.LOG_ENTER + ConstantUtil.LOG_SQL + sql;
String message = ConstantUtil.STRING_NULL;
// SQLのParameterリストがある場合
if (null != plist) {
// plistにの内容をString形式で表示する。
ListIterator listIterator = plist.listIterator();
StringBuffer paramString = new StringBuffer();
while (listIterator.hasNext()) {
paramString.append(" ");
paramString.append(String.valueOf(listIterator.next()));
paramString.append(" ");
paramString.append(",");
}
// 最後の","を除く。
String format = ConstantUtil.STRING_NULL;
if (paramString.length() != 0) {
int index = paramString.length() - 1;
format = ConstantUtil.LOG_SQUARE_BRACKET_LEFT
+ paramString.toString().substring(0, index)
+ ConstantUtil.LOG_SQUARE_BRACKET_RIGHT;
}
// ログに出力のParameterリストの内容を定義する。
message = ConstantUtil.LOG_ENTER + ConstantUtil.LOG_SQL_PARAMLIST
+ format;
}
// Logを出す。
logger.info(messageSQL + message);
}
/**
* LogInfo
*
* ======================
*
* Execute情報をログファイルに出力する。
*
* @param userID:ユーザ名
* @param msg:メッセージ
*/
public static void LogInfo( String userID, String msg ) {
// classの名前とmethodの名前を取得
StackTraceElement stackTrace = (new Throwable()).getStackTrace()[1];
String className = stackTrace.getClassName();
// Loggerを定義する。
Logger logger = Logger.getLogger(className);
// ログに出力のメセッジの形式を定義する。
String message = userID + ConstantUtil.SPACE_HANKAKU + msg;
// Logを出す。
logger.info( message );
}
}
还可以采取以下这种方式:
static{
try {
PropertyConfigurator.configure(System.getProperty("user.install.root")+AxaProperties.getInstance().getProperty("XIAOYAO_LOG_PROPERTIES"));
} catch (Exception e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
}
}
这种方式xiaoyaolog4j.properties只能放在服务器的profiles下,在我的机器上如下:
C:\Program Files\IBM\SDP70\runtimes\base_v61\profiles\AppSrv01
这种不如第一种灵活度大,但是这种更严谨,因为放在服务器级别,对所有的发布到这个服务器的系统都是可见的,不安全。