※ 本記事は以前社内向けにまとめた内容を、外部公開向けに加筆・修正したものです。
はじめに
同僚から引き継いだお客様のシステムは、インストーラーによってアプリをインストールする構成になっていました。
しかし、インストール後に不具合が発生しても、詳細なエラー内容がわからず、原因特定が非常に困難という課題がありました。
そこで今回は、ログ出力機能を自作して組み込んだ経緯と実装内容を、備忘録としてまとめます。
また、その過程でAI(ChatGPT) をどう活用したかについても触れていきます。
調査:VB.NETでログ出力をどう実装するか
まずは、ログを出力させる方法について調査し、以下の2パターンを検討しました。
- log4net を利用する
- 自作で Logger を実装する
結論から言うと、今回は log4net は不採用、自作 Logger を採用しました。
log4net を不採用にした理由
理由はシンプルで、log4net がうまく動かなかったからです。
考えられる要因としては:
- 開発環境が古い
- Visual Studio 2010
- .NET Framework 2.0
- 利用しようとした log4net のバージョンが .NET Framework 2.0 と合っていなかった 可能性
などが挙げられます。
レガシー環境特有の制約もあり、外部ライブラリに時間をかけるより、要件に絞ったシンプルな自作 Logger の方が現実的と判断しました。
※補足:.NET Framework 2.0 に対応した log4net のバージョンを選んだ記憶はありますが、実際にはアセンブリ参照や設定ファイルなど、別の調整が必要だった可能性があります。
参考にした記事
自作実装を進めるにあたり、参考にした記事があったのですが、2026/01時点では閲覧ができませんでした。
その記事にはコードがそのまま掲載されており、最低限のログ出力はできる状態でしたが、以下の点で改善の余地があると感じました。
- ログ出力の責務とアプリ本体のコードが密結合
- ログファイルの管理(保存期間など)が考慮されていない
- 重たい処理(ログ削除やディスクへの書き込み)が同期的に実行されている
- 例外時の情報が十分でなく、デバッグしづらい
- 文字コードが Shift-JIS 前提
そこで、Logger をクラスとして切り出しつつ、必要な改善を盛り込んだ形に作り直すことにしました。
改善ポイントの整理
今回、自作 Logger に対して行った主な改善点は以下の通りです。
-
異なるクラスに分けて実装する
-
Loggerクラスを作成し、ログ出力の責務を分離。
-
-
保存期間の管理機能を追加
- 古いログファイルを自動削除できるようにする。
-
重たい処理を非同期化
- ログファイル削除やディスクへの書き込みなど、時間のかかる処理を非同期で実行。
-
例外処理の詳細化
- 例外発生時に、スタックトレースなどの詳細情報を記録し、デバッグしやすくする。
-
文字コードを Shift-JIS から UTF-8 に変更
- 現在主流の UTF-8 を採用し、文字化けや将来の拡張性に配慮。
これらの設計・実装の多くを、AI(ChatGPT) に相談しながら進めたという点が今回のポイントです。
AI(ChatGPT) による設計・実装の流れ
ここからは、どのように AI(ChatGPT) を使って Logger を作り込んでいったかを時系列でまとめます。
1. まずは「クラス分割したい」と伝える
最初に、参考記事のコードを AI(ChatGPT) に提示しつつ、
- 「このコードを異なるクラスに分割して実装したい」
- 「Logger として再利用しやすい形にしたい」
といった要望を伝えました。
すると AI(ChatGPT) からは、
-
Loggerクラスの作成 - ログレベルの追加
- 設定ファイルでの管理
など、いくつかの改善のヒントが提案されました。
2. ファイル名カスタマイズと保存期間管理の提案
具体的な改善案として、AI(ChatGPT) からは次のような提案がありました。
- 日付やアプリ名を用いた ログファイル名のカスタマイズ
- 保存期間を指定して古いログファイルを削除する仕組み
ただし、このままだと、
「毎回、保存期間を過ぎたファイルを探しに行く処理が同期的に走る → パフォーマンス劣化」
という懸念がありました。
そこで、
- 「処理を遅くしたくない」
- 「ユーザー操作をブロックしない形にしたい」
と伝えたところ、AI(ChatGPT) から 非同期処理での実行案 が出てきました。
3. 非同期処理で重たい処理をオフロード
AI(ChatGPT) の提案をもとに、
- ログファイル削除
- ディスクへの書き込み
といった、相対的に重たい処理を、非同期で行う方針にしました。
これにより、メイン処理のレスポンスを落とさずにログ管理が可能になりました。
4. その他の改善案と取捨選択
さらに AI(ChatGPT) からは、以下のような追加改善案も挙がりました。
- バッファリングでログの書き込み I/O を減らす
- 詳細なログレベル(INFO / WARN / ERROR など)のサポート
- ログディレクトリ・ファイル名・保存期間等を設定ファイルで管理
ただし、今回の案件では以下の理由から見送りました。
- お客様システムとの相性や要件を考えると、機能過多になる懸念があった
- レガシー環境であることから、シンプルで保守しやすい構成を優先
最終的に採用したのは、以下の2点です。
- 例外処理の詳細化
- 文字コードを UTF-8 に変更
5. 文字コードを UTF-8 に変更
AI(ChatGPT) とのやり取りの中で、
「今は Shift-JIS ではなく UTF-8 の方が主流ですよ」
というアドバイスもありました。
ログファイルは長く残り続けるものでもあるため、将来的な互換性や他システムとの連携も考慮し、UTF-8 を採用しました。
6. レガシー環境 (.NET Framework 2.0) への対応
今回の開発環境は、
- Visual Studio 2010
- .NET Framework 2.0
という、今となってはなかなかのレガシー環境でした。
そのため、AI(ChatGPT) に対しても、
- 「.NET Framework 2.0 で動くコードにしてほしい」
- 「古い VB.NET の構文に合わせてほしい」
と明示的に伝えました。
その結果、一部でコンパイルエラーや構文エラーが発生したものの、
- エラー内容を AI(ChatGPT) にそのまま伝える
- 再度修正案を出してもらう
というサイクルを繰り返すことで、最終的にはしっかり動作する Logger クラスが完成しました。
完成した Logger について
最終的に完成した Logger は、以下のような特徴を持つものになりました。
-
Loggerクラスとして独立 - ログ出力先ディレクトリとファイル名を制御
- UTF-8 でログを出力
- 一定期間を過ぎたログファイルを自動削除
- ファイル削除・書き込みなどの重たい処理は非同期実行
- 例外時には、スタックトレースなど詳細な情報を記録
まとめ:AI(ChatGPT) をうまく使えば、レガシー環境でも十分戦える
今回の Logger 実装を通して感じたことは、
「知識が完璧でなくても、ChatGPT をうまく使えば、レガシー環境でもちゃんと動く仕組みを作れる」
ということでした。
もちろん、以下の点は忘れてはいけないと思っています。
- AI(ChatGPT) に丸投げしてコードの意味を理解しないのは危険
- 採用/不採用を判断するのは、あくまで利用者である自分
- 提案されたコードは、自分の責任でレビューし、理解したうえで取り込む
特に、お客様のシステムに組み込むコードであればなおさら、
- 「なぜこの実装なのか」
- 「どのような副作用がありうるのか」
といった点は、最低限押さえておくべきだと感じました。
とはいえ、簡単な機能追加やレガシー環境でのちょっとした改善であれば、
頭を抱えて一人で悩むよりも、まずは AI(ChatGPT) に相談してみる
という選択肢は、大きな時短効果をもたらしてくれます。
タイトルから少し脱線してしまいましたが、
以上、VB.NET(.NET Framework 2.0)のレガシー環境で Logger を自作し、AI(ChatGPT) を活用した話でした。