关于log4j.properties的文件使用-----两点改进

本文介绍了解决多系统共存环境下日志混淆问题的方法,通过为每个系统定制独立的日志配置文件,并调整配置加载方式,实现了日志的有效隔离。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

log4j.properties是定义日志信息的优先级,日志信息的输出目的地,日志信息的输出格式的文件。

现在项目上有两个问题:
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


这种不如第一种灵活度大,但是这种更严谨,因为放在服务器级别,对所有的发布到这个服务器的系统都是可见的,不安全。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值