• ベストアンサー

Java EE同時ログ出力の衝突疑問?

こんにちはJsp+servlet+beanでWEBアプリを作っていますが、 WEBの性質上同時アクセスがあった場合、それぞれがログファイルに書き込もうとして、ログファイルがぐちゃぐちゃになりませんか? シーケンシャル処理(セッションAのログ出力完了後セッションBが出力する)はどうやって実現できますか? なんらかの原因でセッションのログ処理が永遠に終わらない場合、その他のログ出力セッションは待たされますか?(業務が停止すると困るので・) Log4jを使う予定ですが、上記の問題を解決できますか? ありがとうございます。m-.-m

  • Java
  • 回答数1
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • askaaska
  • ベストアンサー率35% (1455/4149)
回答No.1

質問を具体的に書くとこういうことかしら? Log.debug("start user:" + user); Log.debug("end user:" + user); こんなコードがあったとする。 AさんとBさんがアクセスしたときに期待される出力は start user:A end user:A start user:B end user:B だけど、しかし、次のようになることもある。 start user:A start user:B end user:A end user:B 確かに普通に発生する現象ね。 一番単純な考え方は、処理が終了するまではログをバッファリングしておいて 最後のときにまとめて出力 て言うやり方よね。 イメージ的には次な感じ。 buffer.append("start user:" + user); buffer.append("end user:" + user); Log.debug(buffer);

関連するQ&A

  • 【.NET】ログ出力について

    以下の環境のWEBシステムにおいて、ログアウトの際、セッション切れの際にログを出力できないか調査しています。 (サーバーOS) Windows Server 2008 R2 Standard (DB) SQLServer 2008 R2 (開発言語) .NET Framework Version 3.5 SP1 (サイト管理) IIS 尚、現状以下のような調査状況です。 ◇ログアウト時のログ出力 ⇒ .NET上では厳しく、windowsサービスとして別途実装が必要と思われる… ◇セッション切れ時のログ ⇒ セッションを管理しているIIS上でアクセスログとして出力できないか調査中だが…困難と思われる… これらの実現に向けて、何か良いアドバイスがあれば是非お聞きしたいです。 よろしくお願いいたします。

  • Javaでlog4jを使ってログ出力を行っています。

    Javaでlog4jを使ってログ出力を行っています。 環境は以下の通りです。 j2sdk1.4.2 log4j1.2.8 log4j.xml内で指定したログファイル(test.log)を別のアプリで開いた状態で Javaプログラムを実行するとコンソールに以下のエラーが出力されます。 【エラー発生処理】 DOMConfiturator.configure(log4j.xml); 【エラー内容】 log4j:ERROR setFile(null, true) call failed java.io.FileNotFoundException : test.log(プロセスはファイルにアクセスできません。 別のプロセスが使用中です。) ファイルを開いているために書き込めず、エラーになってしまうのは良いのですが、 ログを出力しないだけで処理自体は続行してしまいます。 (ログを書き込めなかったらそこで処理を終了したいです。) 「書き込めなかった場合に例外をcatchする」等のことは可能でしょうか?

    • ベストアンサー
    • Java
  • Java ログ出力方法

    バッチプログラムを作成中なのですが、ログの出し方で悩んでいます。 ログファイルを「バッチID」と「処理日付」の組み合わせで動的に変更したいと思っています。 また、ログは各クラスで出力したいと思っています。 悩んでいる箇所は ・どのようにしてバッチIDを動的に取得してログファイル名として設定するか ・複数のパッケージのクラスを使用するバッチの一連の処理をどのようにして一つのログファイルに出力するか の2点あり、対応方法が検討もつかない状態です。 使用しているライブラリはlog4j 1.2.16.jarです。 アドバイスをいただけないでしょうか。 よろしくお願いいたします。 例として、下記のようなバッチを考えています。 foo.bar.mainパッケージにはpublic static void main(String[] args)のメソッドをもつクラスを配置します。 foo.bar.commonパッケージにはfoo.bar.mainに配置したクラスから共通で利用する処理を実装したクラスを配置します。 foo.bar.main +- Batch1.class +- Batch2.class ・ ・ ・ foo.bar.common +- Common1.class +- Common2.class +- Common3.class ・ ・ ・ 処理の流れで言うと、 Batch1を実行する場合 1. javaコマンドでBatch1実行、Batch1クラスでログを出力 2. Batch1からCommon1クラスのメソッドを実行、Common1クラスでログを出力 3. Batch1からCommon2クラスのメソッドを実行、Common2クラスでログを出力 4. 処理終了 ログは「Batch1_20120612.log」に全て出力される。 Batch2を実行する場合 1. javaコマンドでBatch2実行、Batch2クラスでログを出力 2. Batch2からCommon1クラスのメソッドを実行、Common1クラスでログを出力 3. Batch2からCommon3クラスのメソッドを実行、Common3クラスでログを出力 4. 処理終了 ログは「Batch2_20120612.log」に全て出力される。

    • ベストアンサー
    • Java
  • log4jでログファイルに出力されないです。

    log4jでログファイルに出力されないです。 ただ、まったく出力されないわけではなく、特定のWebアプリから出力されていないようです。 複数のWebアプリケーションから、同じログファイルapp.logに書き込むようlog4j.propertiesに設定しています。 もしかして、これがよくないのでしょうか。 ひとつのWebアプリケーションがログファイルを確保したら、ほかのWebアプリケーションはもう書き込みができないのでしょうか? どうか、よろしくお願いいたします。

    • ベストアンサー
    • Java
  • javaサーブレットでjspへのフォワード処理と、ファイルに出力処理を行いたいのですが。。

    今javaサーブレットとjspでツール作成中です。 DBにアクセスして、その内容をCSVファイルに書き出すというツールなのですが、サーブレットではjspにフォワードという処理と、ファイルに出力という処理の二つを同時に行うことができるのでしょうか。 たくさんの本やサイトにそれぞれ片方の処理だけする場合は載っているのですが、両方を並行して処理させる場合のサーブレットの書き方がわかりません。。 jspからの情報をもとにサーブレットでDAOを生成、DBにアクセスし、検索結果をDTO(一行の情報はBean)に格納し、それをサーブレットからjspにフォワード&CSV出力というものを作りたいと思っています。 よろしくお願いします。

  • Javaでlog4jを使ってログを出力させてます。

    Javaでlog4jを使ってログを出力させてます。 複数のログを出力したいので、同一propertiesに複数のAppenderを定義しています。 内容は以下の通りです。 log4j.logger.processA=DEBUG, A log4j.appender.A=org.apache.log4j.DailyRollingFileAppender log4j.appender.A.File=a.log log4j.appender.A.DatePattern='.'yyyy-MM-dd-HH-mm log4j.appender.A.Append=true log4j.appender.A.layout=org.apache.log4j.PatternLayout log4j.appender.A.layout.ConversionPattern=%d{yyyy/MM/dd HH:mm:ss} %-5p %c - %m%n log4j.logger.processB=DEBUG, B log4j.appender.B=org.apache.log4j.DailyRollingFileAppender log4j.appender.B.File=b.log log4j.appender.B.DatePattern='.'yyyy-MM-dd-HH-mm log4j.appender.B.Append=true log4j.appender.B.layout=org.apache.log4j.PatternLayout log4j.appender.B.layout.ConversionPattern=%d{yyyy/MM/dd HH:mm:ss} %-5p %c - %m%n log4j.logger.processC=DEBUG, C log4j.appender.C=org.apache.log4j.DailyRollingFileAppender log4j.appender.C.File=c.log log4j.appender.C.DatePattern='.'yyyy-MM-dd-HH-mm log4j.appender.C.Append=true log4j.appender.C.layout=org.apache.log4j.PatternLayout log4j.appender.C.layout.ConversionPattern=%d{yyyy/MM/dd HH:mm:ss} %-5p %c - %m%n processAやらprocessB、processCは同一サーバ内で非同期で動くプロセスです。 つまり、動作するプロセス毎にログ出力先を変えてます。 各プロセスを動かすと、ちゃんと想定したログファイルに出力されるんですが、 ローテートの時に「log4j:ERROR Failed to rename ~」のエラーが出て、 正常にローテートしません。 なぜだろうと思って、一度全てのログファイルを削除して、 processAだけ動かしてみました。 すると、a.logだけが出力されると思いきや、 b.logとc.logまで0kbではありますが出力されたんです。 つまり、データこそ出力しないけど、 他プロセスで出力するファイルをロックしてたんです。 これって、同一propertiesに書いているのが悪いんでしょうか? それとも、設定が不足している為、そうなってしまってるんでしょうか? ご存知の方、お知恵をお貸し下さい。

    • ベストアンサー
    • Java
  • サーブレットから別フレームのパラメータを取り出すことは可能でしょうか?

    はじめまして。 JAVA&サーブレット初心者です。 現在、サーブレット、JSPを使ったWEBアプリケーションの開発をしてお ります。 左右二つに分かれたフレームを持つWEBアプリケーションを作っています。 大まかな流れとしては以下の通りです。  (1)左側のフレーム(仮にleft.jspとします)からサーブレット  (仮にservlet1とします)を呼び出す。  (2)右側フレームに(1)の処理結果のJSP(right1.jsp)を呼び出す  (3)right1.jspでサーブレット(servlet2)を呼び出す。  (4)右側フレームに(3)の処理結果のJSP(right2.jsp)を呼び出す。  (5)right2.jspでサーブレット(servlet3)を呼び出す。  (6)右側フレームに(5)の処理結果のJSP(right3.jsp)を呼び出す。   上記のように左側フレームが固定で右側フレームのJSPがサーブ  レット処理によって切り替わるようなWEBアプリケーションを開発し  ています。    問題なのは、今回開発しているシステムの要件により、(5)で呼び出され るサーブレット(servlet3)内の処理で左側のフレーム(left.jsp)の入力 パラメータが必要だということです。  servlet1でleft.jspの入力パラメータをセッションオブジェクトに保管 し、servlet3でセッションオブジェクトから復元すれば実現は可能かと思 いました。  しかし、途中servlet2からの処理が大変重いものであり、セッションオ ブジェクトは一定時間がたつと無効になってしまうと聞いたのでタイトル のような方法を考えたのですが、見当がつかず、今回の質問に至りました。  request.getParameter("****"); ではもちろん取り出せないと思いますが、サーブレットで別フレームのパ ラメータを取り出すことは可能でしょうか?

    • ベストアンサー
    • Java
  • logファイルの出力条件

    読み込みボタンと出力ボタンの2つのボタンがあり、 読み込みボタンでlogファイルを読み込みエクセル上に表示して、出力ボタンでlogファイルを出力するというものを作成したのですが、logファイルの名前によって出力できるかできないかの判断をしたいのですがどのようにすればいいのか分かりません 例)A.logの場合出力可、B.logの場合出力可、C.logの場合出力不可みたいに よろしくお願いします

  • java log4jの環境設定

    調べてみたのですが、参考になるページが見当たらなかったので(私が理解できなかっただけかもしれませんが。。) ご質問させていただきます。 表題の件です。javaのサーブレットを用いてログ出力する為にlog4jを使用しています。 そのため、log4j.xmlにファイルの出力先やらなんやらを記述しています。(これが通常だと思います) tomcatのWEBアプリケーションパッケージですので、DB接続等の設定は「META-INF/context.xml」に記述(Javaアプリ側で名前解決してDatasourceとして取得)しています。 上記からDB接続情報、ログの出力先情報はそれぞれ別ファイル(XML)から取得していますが、環境依存する値なので、編集するならひとつのファイルから行いたいです。 できれば、log4jのファイル出力先情報等をcontext.xmlにて記述して解決したいです。 (理由:tomcat6/servlet2.5を使用しており、tomcat6のdbcpを使用してコネクションプーリングしている為、DB接続の方法は変更したくない為) 以上、ご存知の方ご教授お願いできますでしょうか。

    • ベストアンサー
    • Java
  • リンクの値→サーブレット

    いつもお世話になっております。 今回もよろしくお願いいたします。 (1)jsp画面のリンクの値をServletへおくる (2)ServletでDBアクセスし、処理を行う (3)(2)で処理した値をBeanに格納する (4)jsp画面でBeanの値を取得する といった流れをしています。 [(1)のjspでのコード(一部)] <form name= henkou method="post" action="../servlet/RequestServSession"> <a href= "../henkou.jsp"> <input type=hidden name=MySubmit> <jsp:getProperty name="reqObject" property="id" /> </a> </form> <script language="JavaScript"> function func(MyCommand){ document.henkou.MySubmit.value=MyCommand; document.henkou.submit(); } </script> [(2)Servletのコード(一部)] String strId = (String)request.getParameter("MySubmit"); String strSesId = new String(strId.getBytes("iso-8859-1"),("Shift_JIS")); int intId = (Integer.parseInt(strId));           ・           ・           ・ //処理された値をBeanに格納 HttpSession session = request.getSession(); *1→session.setAttribute("id",sid); *2→session.setAttribute("name",name); *3→session.setAttribute("biko",biko);           ・           ・           ・ などを実行すると、(4)では   *1→ 0   *2→ null   *3→ null が表示されます。 リンクの値がServletへきちんと送れていないのだと思い、jsp→Servletのみで実行したところ、 "Http-500エラー NullPointerException" が発生します。 どのようにしたらうまく値をおくることができるのでしょうか? どなたかご教授のほどよろしくお願いいたします。 

    • ベストアンサー
    • Java

専門家に質問してみよう