質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

1回答

558閲覧

Javaロギング:サーブレットを通すとログファイルへの書き込みできない

komatta_Chan

総合スコア1

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2023/03/16 03:46

実現したいこと

WEBサーブレットからロギングクラスのメソッドを呼び出して、ロギングしたい。

前提

Windows11、Java8、Tomcat8、eclipseを使用。
クラスLogGetにメソッドrecordLog()を作成ます。このメソッドにロギングに必要なコーディングをしました。
このロギングのクラスに対して、次の2通りの方法で実行します。
1 javaアプリでmainメソッドからこのクラス(メソッド)を呼びだす
2 サーブレットからこのクラス(メソッド)を呼び出す

発生している問題・エラーメッセージ

上記1の場合は設定どおりの出力が得られますが、2の場合はコンソールに表示されますが、設定したFomatterでは出力されません。

該当のソースコード

Java8
public class LogGet {
private static final Logger login = Logger.getLogger(LogGet.class.getName());
public void recordLog(String id, String adr, boolean result) throws IOException{
System.setProperty("java.util.logging.SimpleFormatter.format", "%1$tF %1$tT.%1$tL%n %2$s %3$s%n %4$s:%5$s%n");
Formatter fm = new SimpleFormatter();

//親ロガーに送信するかどうかtrueで送信 login.setUseParentHandlers(false); //logger Level login.setLevel(Level.FINE); //FileHendler obj Handler loginHandler = new FileHandler("loginStatus.log", true); //Handler output form loginHandler.setFormatter(fm); //add FileHandler to Logger login.addHandler(loginHandler); //FileHandler Level loginHandler.setLevel(Level.FINE); //ConsoleHandler obj ConsoleHandler loginCon = new ConsoleHandler(); //ConsoleHandler output form loginCon.setFormatter(fm); //add ConsoleHandler to Logger login.addHandler(loginCon); //ConsoleHandler Level loginCon.setLevel(Level.FINE); //LogManager.getLogManager().readConfiguration(LogGet.class.getResourceAsStream("loginLog.properties")); //Logger login = Logger.getLogger("LogGet"); if (result) { //login.fine(id + ":" + adr + "ログイン成功"); login.log(Level.FINE, id + ":" + adr + " ログイン成功"); } else { //login.fine(id + ":" + adr + "ログイン失敗"); login.log(Level.FINE, id + ":" + adr + " ログイン失敗"); } }

}

@WebServlet("/LogGetMainServlet")
public class LogGetMainServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String id = "servlet", adr = "192.168.100.32";
boolean result = true;
LogGet lg = new LogGet();
try {
lg.recordLog(id, adr, result);
} catch (IOException e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
}
}
}

public class LogGetMain {
public static void main(String[] args) {
String id="mainMethod", adr="192.168.158.42";
boolean result = true;
LogGet lg = new LogGet();
try {
lg.recordLog(id, adr, result);
} catch (IOException e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
}
}
}

試したこと

サーブレットから直接LogGet#receordLog()を呼び出すのではなく、modelを作成しましたが、結果は変わりませんでした。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jimbe

2023/03/16 05:42

コードにはコードのマークダウンを使用してください。
guest

回答1

0

ベストアンサー

右クリック ⇒ 実行 ⇒ 実行の構成 で実行構成ウィンドウが出るので、Apache Tomcat - Tomcat8_Java8 の作業ディレクトリ(引数タブにあります)を確認してみてください。
おそらく、プロジェクトフォルダ以外の場所が設定されてるのではないでしょうか?今までのログはこちらのフォルダに出力されています。

作業ディレクトリをプロジェクトフォルダに変更すれば、mainメソッド実行時と同じログファイルが編集されるようになります。

※Javaアプリケーション - LogGetMain の作業フォルダがプロジェクトフォルダであること前提で記載しています。もし万が一別のフォルダであれば適宜読み替えてください。

投稿2023/03/17 15:13

ho-ta-te

総合スコア112

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

komatta_Chan

2023/03/20 05:01

大変ありがとうございました。助かりました。感謝申し上げます。 表示については、なお、表示につきましては、SimpleFormatterではデフォルトのままなので、MyFormatterクラスを作成し、Formatterをextendsして作成した結果、うまくいきました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問