- PR -

Log4j(Beansのログ出力)の理屈を教えて下さい。

投稿者投稿内容
kejiuyudu
ベテラン
会議室デビュー日: 2004/08/11
投稿数: 82
投稿日時: 2004-09-19 07:32
おはようございます。Log出力で質問があります。

まず,2点のソースを作成し,下記の工程を実施しました.
LogServlet.java(サーブレット用)
LogBeans.java(Beans用)

*工程*
1.LogServlet に Logの初期化及び各ロギングの設定(ログの出力先:logAppender.txt)
2.LogBeansを生成.データベースからデータを取り出し,LogBeans にデータをセット
3.LogBeansの ggggメソッドを実行(セットされたデータを加工し,呼出側のLogServlet に return で加工データを返す)
4.getRequestDispatcher で jsp に遷移

===========================================

ここで質問です.
logAppender.txt に ログを出力する設定をしたから, LogServletのログがlogAppender.txtに出力されるのは分かります。しかし,LogBeansではログの出力先の設定はしていないのに,なぜ呼出側であるLogServletの出力先logAppender.txtにLogBeansのログが出力されるのですか?

*自分の考え*
LogBeans の生成やLogBeansのメソッドの実行は,呼出側である LogServlet 処理の流れの一部だから。と無理矢理、理由付けしたのですが、実際はどうなのですか?
よろしくお願いします。

[ メッセージ編集済み 編集者: ryo 編集日時 2004-09-20 19:12 ]
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2004-09-20 01:59
書かれている内容だけから見ると、
引用:

1.LogServlet に Logの初期化及び各ロギングの設定(ログの出力先:logAppender.txt)


これが具体的に何をしているのか、

引用:

しかし,LogBeansではログの出力先の設定はしていないのに,なぜ呼出側であるLogServletの出力先logAppender.txtにLogBeansのログが出力されるのですか?


LogBeansからどのようにログ出力をしているのかわかりません。

その部分だけでもコードを書いてみてもらえませんか。
kejiuyudu
ベテラン
会議室デビュー日: 2004/08/11
投稿数: 82
投稿日時: 2004-09-20 02:26
はい、すぐに全部載せます。
kejiuyudu
ベテラン
会議室デビュー日: 2004/08/11
投稿数: 82
投稿日時: 2004-09-20 02:32
質問内容:
ログの出力先を設定していない Beans 上のログ出力が、呼出側のログ出力先(./logs.txt)に記載されるのかという理論がわかりません。
自分の考えとしては、上記のように、Beans の処理が呼出側の処理の一部として行われているから呼出側の出力先にログ出力されると考えたのですが、実際はどういう理論なのでしょうか?よろしくお願いします。

================================================
***LTCInfoLogServlet.java***

package ltcinfo;

import org.apache.log4j.*;
import java.io.*;
import javax.servlet.http.*;
import javax.servlet.*;

public class LTCInfoLogServlet extends HttpServlet {
static private Logger logger;
public void init(){
String logConfigFileName = this.getInitParameter("log4jConfigFile");
if(logConfigFileName != null){
String realLogConfigFileName = this.getServletContext().getRealPath(logConfigFileName);
PropertyConfigurator.configure(realLogConfigFileName);
} else {
log("Initial Parameter Illeagal:log4jConfigFileName");
try{
String realLogFileName = this.getServletContext().getRealPath("defaultLog.txt");
PatternLayout pl = new PatternLayout("%d %p - %m%n");
FileAppender fa = new FileAppender(pl,realLogFileName);
BasicConfigurator.configure(fa);
}catch(IOException ex){
BasicConfigurator.configure();
}
}
logger = Logger.getLogger(LTCInfoLogServlet.class.getName());
}
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
int year, month, day;
logger.info("講義時間変更Webアプリケーションリクエスト");
try{
year = Integer.parseInt(request.getParameter("Year"));
month= Integer.parseInt(request.getParameter("Month"));
day = Integer.parseInt(request.getParameter("Day"));
}catch(NumberFormatException ex){
logger.error("例外発生" + ex);
getServletContext().getRequestDispatcher("/jsp/LTCInfoErrorJSP.jsp").forward(request,response);
return;
}
logger.info("日付:" + year + "年" + month + "月" + day + "日");
LTCInfoQueryBeans ltcInfoQueryBeans = new LTCInfoQueryBeans();
ltcInfoQueryBeans.setYear(year);
ltcInfoQueryBeans.setMonth(month);
ltcInfoQueryBeans.setDay(day);
ltcInfoQueryBeans.execute();
request.setAttribute("ltcInfoQueryBeans",ltcInfoQueryBeans);
if (ltcInfoQueryBeans.getCountOfResults() != 0){
logger.debug("講義時間変更情報あり用のJSPに処理を移行");
getServletContext().getRequestDispatcher("/jsp/LTCInfoReportJSP.jsp").forward(request,response);
} else {
logger.debug("講義時間変更情報あり用のJSPに処理を移行");
getServletContext().getRequestDispatcher("/jsp/LTCInfoNoneJSP.jsp").forward(request,response);
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
this.doGet(request,response);
}
}


========================================================================================================
***LTCInfoQueryBeans.java***

package ltcinfo;

import java.io.*;
import java.sql.*;
import java.text.*;
import java.util.*;
import org.apache.log4j.*;

public class LTCInfoQueryBeans implements Serializable {
private int year;
private int month;
private int day;
private static Logger logger = Logger.getLogger(LTCInfoQueryBeans.class.getName());

private String[] results;
public LTCInfoQueryBeans() {}
public void setYear(int year){ this.year=year; }
public void setMonth(int month){ this.month=month; }
public void setDay(int day){ this.day=day; }
public int getYear(){ return year; }
public int getMonth(){ return month; }
public int getDay(){ return day; }
public int getCountOfResults(){
if (results == null){
return 0;
} else {
return results.length;
}
}
public String getResults(int index){ return results[index]; }

public void execute(){
String server = "localhost";
String db = "ChangeInfoDB";
String url = "jdbc:mysql://" + server + "/" + db + "?useUnicode=true&characterEncoding=EUC_JP";
String user = "student1";
String password="student1";
String sql;
try {
Class.forName("org.gjt.mm.mysql.Driver");
Connection con = DriverManager.getConnection(url,user,password);
Statement stmt = con.createStatement();
DecimalFormat df4 = new DecimalFormat("0000");
DecimalFormat df2 = new DecimalFormat("00");
String sdate = df4.format(year) + "-" + df2.format(month) + "-" + df2.format(day);
sql = "SELECT * FROM changeinfo where kdate =" + "'" + sdate + "'";
logger.info("SQLステートメント作成");
logger.debug("SQL:" + sql);
ResultSet rs = stmt.executeQuery(sql);
Vector resultList = new Vector();
while(rs.next()){
String str = rs.getString("kdate") + " " + rs.getString("jikan") + "時限目 担当:" + rs.getString("teacher");
if (rs.getString("alternate").equals("Y")){
str += " 振替授業あり";
} else {
str += " 振替授業なし";
}
resultList.add(str);
}
if (resultList.size() == 0){
results = null;
} else {
results = new String[resultList.size()];
for(int i=0; i<resultList.size(); i++){
results[i] = (String)resultList.get(i);
logger.debug("result[" + i + "]:" + results[i]);
}
}
rs.close();
stmt.close();
con.close();
} catch (Exception ex) {
System.out.println("Exception: " + ex.getMessage());
results = null;
}
}
}


================================================================================================
***設定ファイル***

log4j.rootLogger=DEBUG,FILE
log4j.appender.FILE=org.apache.log4j.FileAppender
#log4j.appender.FILE.File=./logs.txt
log4j.appender.FILE.File=/usr/local/tomcat/webapps/LTCInfoFirst/logs.txt
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.ConversionPattern=%d{yyyy/MM/dd HH:mm:ss.sss} %c [%t] - %m%n

[ メッセージ編集済み 編集者: ryo 編集日時 2004-09-20 02:40 ]

[ メッセージ編集済み 編集者: ryo 編集日時 2004-09-20 19:11 ]
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2004-09-20 23:21
BasicConfigurator#configureで設定すると、ルートカテゴリに対してアペンダの設定を
したことになります。したがって同じクラスローダにロードされたクラスであれば、すべて
同じ設定で出力されるでしょう。
kejiuyudu
ベテラン
会議室デビュー日: 2004/08/11
投稿数: 82
投稿日時: 2004-09-21 03:03
それは、上記のように 外部ソースを
PropertyConfigurator.configure(realLogConfigFileName);で設定して、
Beans上で
private static Logger logger = Logger.getLogger(LTCInfoQueryBeans.class.getName());してもなのでしょうか?

[ メッセージ編集済み 編集者: ryo 編集日時 2004-09-21 03:09 ]
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2004-09-21 06:26
どうしても納期に間に合わない!というような理由がないのであればまず
・動かして試す
・マニュアルを読む
・ソースを読む
等した上で聞いても遅くはないのではないでしょうか?幸い Log4J はドキュメントもソースも公開されてるわけですから。読む気がないのなら商用のアプリケーションサーバに乗り換えてそちらのログ機能を使うことをお勧めします。調べている工数と比べると実はその方がよっぽど安いかもしれません。

で、手を動かした上で
・こんな動きになってしまったけどなぜ?
・マニュアルのどこを読んだけども意味がわからなかった
・ソースのここを読んだけどもいまいち終えなかった
といった具体的な質問をすると回答しやすくなります。
そうすれば
・こう使うのが正しいです
・あの記述はこういう意味です、英語のマニュアルにはこんなニュアンスで書いてありますね・・
・実際にその処理をやっているのはここです
といった回答を導き出すことができますよ。

人に聞くのは悪いことではありませんが、回答しやすいようにある程度の努力をすべきです。
ソースも全部のっけるのではなくて現象を再現させるのに必要最低限なコードに絞ると良いですね。幸いここの掲示板では結構親身に読んでくれる人が多いですが、あまり甘えすぎもいかがなものかと。

[ メッセージ編集済み 編集者: インギ 編集日時 2004-09-21 06:32 ]
kejiuyudu
ベテラン
会議室デビュー日: 2004/08/11
投稿数: 82
投稿日時: 2004-09-21 06:45
本当にすみませんでした。
このソースが何をしようとしているのかは分かります。予想通り、実行もうまくいきますが、書籍には詳しい理論上の体系説明が載っておらず、どうしても自分の予測解析になってしまい、正しい体系説明を得たく、載せてしまいました。もっと書籍を購入して自力でがんばってみます。
本当に御迷惑をお掛けして申し訳ございませんでした。

スキルアップ/キャリアアップ(JOB@IT)