- PR -

アプリケーションの操作ログ出力の実装方法

投稿者投稿内容
デューン
大ベテラン
会議室デビュー日: 2004/04/21
投稿数: 174
お住まい・勤務地: Tokyo
投稿日時: 2009-02-04 20:53
私もセラフさんのおっしゃるように
UI層のログとは、
「ラジオボタンが切り替わった」「ボタンが押された」
というのを想像してしまいます。
ユーザーの動作のログであって、ユーザーの操作(目的)のログにはならないというか。

たとえば同じボタンが押されたとしても、他の要素によって挙動が変わることがほとんどだとおもいますし、UI層で行うのはあまり得策ではないように思います。
別の層の入口や出口か、結果の入れ物(MVCならM)に対してログが出せるようにしこんでおくとか。

indigo-x
大ベテラン
会議室デビュー日: 2008/02/21
投稿数: 207
お住まい・勤務地: 太陽の塔近く
投稿日時: 2009-02-05 09:49
引用:

かつひとさんの書き込み (2009-02-04 13:21) より:
 機能要求あるいは非機能要求で操作ログ出力が明記されている、または法的な理由(セキュリティ)etcで実装を余儀なくされていると仮定します。



バリデーション&トレーサビリティ(GLP/CSV/FDA 21等)を想定されているのでしょうか?
もし想定されているのであれば、「ボタンを押された」等は全く価値がなく意味がありま
せん。データの変化を完全に把握できないと意味はないです。付け加えで情報を見たも
あまり意味はありません(ログインされているのだから)

#私はデータに対して完全履歴で対応しました。
#(例えば過去A氏が登録した画面がリードオンリーで見ることが可能です)


[ メッセージ編集済み 編集者: indigo-x 編集日時 2009-02-05 09:50 ]
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2009-02-06 01:06
引用:

かつひとさんの書き込み (2009-02-04 13:21) より:
・開発者の仕様理解度・技術レベルよって、実装したりしなかったりする。
  unibon様の文章をお借りしますと、漏れる可能性があるということです。
・以下のようなハードコーティング的なコードが散在、保守困難になる。
  例) Log.Write(userName + "△△情報を検索しました。");


層をはっきりと分けて、粒度の違う層が混じらないように注意さえすれば、今回の場合、もし外側でログ書き込みをするとすれば、
「『ドメイン』層を呼ぶ人は、かならず Log.Write をしなければならない」
というコーディングルールを決めれば良いと思います。そして、『ドメイン』層が持つメソッドごとに、ログに書く内容(どのメソッド引数とメソッド戻り値を書くか)を決めておきます。こうすれば、コーディングする人によるブレはなくなると思います。

ログのコーディング漏れは私はあってもしかたがないと思います。もしもたかがログを書くのに漏れがあるようでは、ログ以外の肝心の本体のコードですでに盛大に漏れがあり、品質が高くないことが予想されます。
ただ、ログの漏れをどうしても抑えるならば、デザインパターンのどれかを使って、メソッドの入り口や出口でかならずログのコードを通るようにすることも、ある程度パターン化できるのかもしれません。ただ、余計に複雑になるわりにはそれほどの効果はないかもしれません。

それに、上述のようなコーディングルールを決めておけば、『ドメイン』層のメソッドをひとつひとつ検査して、かならず Log.Write が伴っているかを検査すれば、それで漏れがあれば見つけることができ、コードの品質も保てるはずです。



また、内側でログを書くとすれば、『ドメイン』層のメソッドの出口直前で書く、という決めにすれば良いと思います。成功や失敗というメソッド戻り値の情報が要ることもあるので、入り口で書くのは難しいかもしれません。

また、『ドメイン』層は、先日の例で言えば、User のモデルと Book のモデルの双方を関連付ける、コントローラーを作っておき、それを上位層から呼ぶ、というふうにしないと、ログに書くコンテキストが不足するかもしれません。コントローラーのコードをUI層に書いてしまうと、最初のご質問のように、ログに書くものがコーディングする人ごとにブレが出てしまいます。
かつひと
常連さん
会議室デビュー日: 2006/06/01
投稿数: 32
投稿日時: 2009-02-06 09:01
 ログを出力する目的や考え方によって、実装方法も工夫が必要ということが分かりました。
皆様、大変参考になるアドバイスを頂き、誠にありがとうございます。
自分の開発するアプリケーションにおいて、どのような方法が適切か、じっくり考えてみたいと思います。

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