![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
ログ出力する内容について
業務ロジックにおいて、ログ出力する内容ってどのようなものが効果的なのでしょうか?
処理続行できないようなマスタ不正や、DBデータ不正のようなエラー発生時は例外などでメッセージを出してしまうのが多いので、わざわざログ出力しなくても・・・とおもってしまいます。
デバッグは開発時には便利なのでこれはわかるのですが、本番時は使用しません。
アクセスログとかは必要ですが、業務ロジックとは別なので、業務ロジックにおいて、こんなログを出すと便利とかありましたら教えて頂けないでしょうか。
またログレベルの選定の1方針なども合わせて教えて頂けるとうれしいです。
昔みたのは画面のオペレーションで警告がある場合、warnで出力してエラーの場合はerrorで出力してたような気がします。
例えば一覧表示の中の項目の詳細をみようとして、すでに削除されていた場合(排他など)は警告メッセージを画面に出してwarnでログを出力する。
null参照など本来想定しないエラーの場合、エラーメッセージを画面に出してerrorでログを出力する。
ただ想定されるエラー(排他で削除されたデータを参照)をいちいちログ出力する意味はないと感じますし、null参照などのケースは例外のメッセージで十分な気がします。
それとも使い方が違うとかなのでしょうか?
例えば本来起こりえないエラーやユーザのオペレーションでは直らない(マスタ不正など)場合に、システム管理者が検知するためにログを出すなどでしょうか?
エラーがでたということを検知するためにログ出力を行って、例外時のメッセージは解析のために使うとかなんでしょうか?
No.1ベストアンサー
- 回答日時:
>業務ロジックにおいて、ログ出力する内容って
>どのようなものが効果的なのでしょうか?
単一の正解は存在しません。
業務要件、性能要件(レスポンス及び容量)、運用要件などの
バランスを考慮した上で規定するのが一般的です。
セキュリティ(完全性)を求めるシステムでは、
業務トランザクションのログトレースが行えることが要件となったりもします。
・アクセスログで追跡可能なように考慮しておく
・TPモニタ導入等、ミドルウェアで解決する手法をとる
などもありますが、
・業務ロジックのログ出力で管理する
方法もよく利用されます。
システム利用状況の管理手段として、
アクセスログからの解析が難しい情報を出力させることも多いです
# 事前の運用設計が甘い場合に、追加要件となりがち。
# 事前に考慮していれば簡単なことも、
# 事後対応では対処が難しい、でよくある話の筆頭かも。
・ログインセッション数の把握
・想定エラーによるトラン破棄発生数の把握
(→詳細設計レベルの不備が原因で、頻発する場合があります)
など
この回答への補足
それともスタックトレースも、私が知らない場所でアプリケーションの開発者が
どこかで行っていて、自動的に出力するようなものはないのでしょうか。
今までlog.error("エラーメッセージ")などでログ出力を済ませていました。
何かあるとログAに上記が出力されるので、解析をはじめる感じでした。
詳細は解析時にスタックトレースが吐かれているログファイルをみて確認していたので、
スタックトレースは自動的に出るものと思っていました(ほんとうはもっと
考えてないといけなかったと思います)。
アドバイス有難うございます。
処理には直接製係はないのですが、運用等で効果的なログがあるかないかでだいぶ違いますね。
単純なようで奥深く感じます。
アドバイス頂いた内容をきちんと理解できるようによく考えて見ます。
申し訳ありません。最初の質問に例外はログに出力されると自分で書いておきながら、
よく考えてみたらロガーで自分で出していないのに何でだろうと分からなくなりました。
eclipseではコンソールに例外情報が出ますが、結合試験環境でははサーバのログファイル
に出力されていました。
よく考えずにいましたが、例外をthrowした時は標準出力に出力されるが、サーバの
ログファイルに出力されているということはサーバの標準出力の設定先がファイル指定
されているという認識で合っていますでしょうか。
どういう経路でthrowされた例外がサーバのログに出ていたのだろうかと・・・。
もしよろしければご回答頂けると幸いです。
No.4
- 回答日時:
>どういう経路でthrowされた例外が
>よく考えずにいましたが、例外をthrowした時は標準出力に
>出力されるが、
Javaアプリケーションサーバの場合、
例外throwの出力先は、標準エラー出力です。
Javaの仕様に準じています。
>サーバのログファイルに出力されているということは
>サーバの標準出力の設定先がファイル指定されている
>という認識で合っていますでしょうか。
標準エラー出力であること以外は、合っています。
>どういう経路でthrowされた例外がサーバの
>ログに出ていたのだろうかと・・・。
Javaアプリケーションサーバ(Tomcat)といえども、
起動は javaコマンド で
org.apache.catalina.startup.Bootstrapクラス
を呼び出しています。(クラス名はtomcat5.5の場合)
普通のJavaアプリと同じです。
従って、ログファイル指定の実態は、起動時に
java .... >stdout.log 2>stderr.log
とリダイレクトしているだけですね。
# なお、WebLogicやWebSphere等のベンダー謹製APサーバの場合、
# このあたりを直接変更するのは禁止だったりします。
返事が遅れました。ごめんなさい。
なるほどリダイレクトですか。
ベンダー製の場合は直接変更するのは禁止なのですか。
両者とも少しだだけ使った(とはとてもいえないけど)ことはありますが、
その辺りあまり注意していませんでした。
No.3
- 回答日時:
#2です。
Directory Proxy Server のログレベルの話を参考URLに示します。
選定の1方針として役立たないでしょうか。
ログファイルは用途別に分けておかないと、あとで見るのも大変ですから、最低でもデバッグ用と本番用のログは別ファイルにするとか、ログレベルで切り分けて本番実行時には出力しないのが当然だと思っています。
ですので、おっしゃるとおり、「想定されるエラー(排他で削除されたデータを参照)をいちいちログ出力する意味はない」と感じます。(少なくとも本番用のログには。)
>「null参照などのケースは例外のメッセージで十分な気がします。」
出力する中身は例外のメッセージで十分かも知れませんが、これは本来起こりえないエラーですから、本番用のログに出力されるべき、ではないでしょうか。
私が以前関わったことのある某企業のシステムでは、当時、夜間にバッチ処理がかなりの数、実行されるということになっていました。
なので、それぞれのバッチ処理のログとは別に、監視用のログを一つ作って、こんな感じで出力しようという案がありました。
Windowsパソコンで言えば、こんな感じですね。
99/99 99:99 デフラグ 開始
99/99 99:99 デフラグ 正常終了
99/99 99:99 ウイルスチェック 開始
99/99 99:99 ウイルスチェック 正常終了 処理対象ファイル1,234,567件
#このログを監視していれば、夜間バッチ処理が終わったか判るので、
#異常があればその処理のログを見に行く、という考えですね。
#諸般の事情で没になりましたが。
#1さんのほうに書かれた疑問については、申し訳ないですが 詳しいことは判りかねます。
実行環境なり、別のところなり、に、コンソールに出力された内容がログに出力されるような機能がある、というのは考えられます。
参考URL:http://docs.sun.com/source/819-2016/ICLogs.html
返事が遅れました。ごめんなさい。
確かにどこまで実行されたか分かると問題箇所の特定に繋がると、
最近試験をしていて感じました(他のグループが作った箇所
なので、どう動いているのかさっぱり分からなくてどこまで
正常に動いてるの~と)。
あと例外が発生する件については、昔のことなので確認できないのですが、
springのインターセプターで例外を取得したときの処理で
ログを出していた・・・という可能性も最近思いました。
最近、そういうことができると知ったので・・・。
No.2
- 回答日時:
エラーをログ出力するのは基本だと思いますが、正常動作しています、ということがわかるようにログを吐く場合もありますね。
処理開始~終了~処理件数を出力しておくとか。
なるほど。そういうログもあるのですね。
かなりな量になるかと思いますが、本番でも出力するようなレベルでしょうか。
それとも開発時のみのデバッグ的なログでしょうか。本番時だとすると、
ファイルを専用に持つような形と思ってよいでしょうか。
またもしよろしければ、onosukeさんの方に書かせて頂いた疑問について
も頂けると幸いです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
eclipseでコンソールのピン留め...
-
flush()とclose()について
-
POIでExcelに時刻(h:mm)の値を...
-
System.err. printlnとSystem.o...
-
1~100までの数字を表示し、か...
-
System.out.printlnの意味がよ...
-
getName()で取得したファイル名...
-
バイトスワップ
-
javaにおけるCSV出力時の文字コ...
-
大容量のテキストファイルの内...
-
javaのUDP受信プログラムについて
-
java
-
stderrとstdout
-
[JAVA]try 内の変数を外で!?
-
VBAで配列の計算
-
【Java8以降】csvファイルの複...
-
プログラミングの問題です。大...
-
Java配列でNullPointerExceptio...
-
オブジェクトの中のプロパティ...
-
JPanelの切り替えと再描画
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
System.err. printlnとSystem.o...
-
flush()とclose()について
-
Log4jで機能毎に別ファイルへ出...
-
System.out.printlnの出力先
-
Javaで改行などが出来ないのです。
-
1~100までの数字を表示し、か...
-
system.out.printが出力されない
-
Eclipseのコンソールを常に表示...
-
1~100までの数字を表示したい
-
StringBufferで改ページ処理を...
-
JavaScriptの変数をjavaのメソ...
-
Log4Jではログを改行できない?
-
javaにおけるCSV出力時の文字コ...
-
テキストエリアで改行する
-
switch分が機能しません。
-
Tomcatが無応答となる現象が起...
-
一定のスペースを空けて端を揃...
-
JAVAのServletで、画像表示につ...
-
バイトスワップ
-
InputStreamはreadが1回しかで...
おすすめ情報