ログをいい感じで残す その2
前回の話 の続きです。
デバッガー、コンソール、テキストファイルの3か所にそれぞれログを流すようにした、という話でした。
というわけで、しばらくこのやり方でやっていたのですが、ちょっとマズイことに気がつきました。ヴィータ大脱出を二つ同時に起動するとテキストファイルに出したログが破綻するんです。
同じログファイルを二つのEXEが使おうとするため後から起動した方のEXEがログをクリアしてしまったり、先に起動した方のEXEがファイルをロックしていて後から起動したEXEは一切ログの書き込みができなかったり……考えてみれば、そりゃそうですよね。
とても分かりやすい図解。
確かプロセス間で同期を取る仕組みがあったと思うので、それを使って互いに配慮しながらログを書き込もうか……と思ったこともありましたが、面倒くさかったのでもっと単純に、ヴィータ大脱出を複数起動出来ないようにしました。
もっとも、ヴィータ大脱出を複数起動してしまうとセーブファイルの書き込みで問題が発生したりするので、最終的には禁止するつもりではありましたが。
ちなみに今開発しているあやかし紅白戦では、複数起動しても問題なくログファイルが書き込めるようにしてあります。
複数のEXEが一つのログファイルを使えるようにしたため、誰が書き込んだのか区別できるようにプロセスIDを追記するようにしました。
また、ログの見た目を整えるためにインデントする機能なんかがあったのですが、それは廃止しました。インデントありの行とインデント無しの行が混在する可能性があるからです。
ところで、多重起動の他にもう一つ問題がありました。
起動時にログをいったんクリアしていたため、最後に起動したときのログしか残らないという点です。
つまり、強○終了が発生した後、一度でもゲームを起動したら強○終了時のログファイルが上書きされるって事なんですよね。
テスト配布した時のエラー報告なんかでこの事故が多発しました。
(「不具合が起きた!」というユーザーさんから何の問題も起きていないログファイルが送られてくるという……)
それと以前、強○終了時にその時のエラー内容をログに記録云々という話をしましたが、それはあくまでも強○終了したときに特別に作られるエラー報告用のファイルであって、今回の話のように普段から記録しているようなログファイルとは異なります。
そこで、ログファイル名に日時を入れて、毎回新しいログファイルに書き込むようにしたのですが……まあ、すぐにやめました。ファイルがどんどん増えてしまうんです。ストレージ(Cドライブ)が64GBしか無いド〇キノートでは(ry
じゃあ古いファイルを自動で消せばいいじゃないか?となったんですが、「ファイルを自動で消す」という動作が嫌な予感しかしなかったのでやめておきました。
ファイル名に日付が入るということは、あらかじめファイル名がビシッと決まってはないという事です。なので、消してもいいファイルなのかどうかをファイル名から自動判別させないといけません。
が、それだと関係無いファイルを消してしまうという事故がありそうで怖かったからです。
生成したログ名を別のファイルに記録しておいて、それを参照するという手もあります。
ただ、ユーザーが誤ってそのファイルを消してしまった場合にはログ名が分からなくなり、ログを削除できなくなってしまいます。まあ手動で消せばいいんですが……。
ログ専用のフォルダを作って、その中身は問答無用でログとみなすという方法もありますが、たかがエロ同人ゲームでログ専用のフォルダとか余計なもの作られるってのもねえ……ということで却下。
悩んだ挙句、ログファイルは一つだけにして、ログを開くときにファイルサイズを調べ、10MB以上のサイズだったら10MBになるように古い行を削る、という仕様にしてみました(ちなみに10MBという数字は割と適当に決めたものです)。
仕組みは単純で、いったんログを読み出しモードで開いてバッファに全テキストをロードして閉じ、テキストが目的のサイズになるように加工し、今度は書き込みモードで開いて書き込むというものです。
なんかもっとスマートに出来そうな気もするのですが、起動時の一回しかやらない処理なのであまり追求しないことにします。
やってることはリングバッファと同じですね。
これもしばらくはOKだったのですが、かなりの長時間起動していた場合に一回の起動でログが10MBを超えてしまう時があるんですね。
そうすると、起動して最初の方で記録した内容がいきなり消されてしまうんですよ。
結局、紆余曲折を経て最終的には過去3回分より古い部分を削除する、という仕様で落ち着きました。
まず、ログの書き込み開始するときに必ず区切り用のテキストを出力するようにします。
起動時にログテキストをロードし、区切りテキストを後ろから検索して、3つ目の区切りテキストが見つかったところで、それよりも先頭側のテキストを削除して再保存する、いうものです。
ちなみに区切りテキストは
"------------------------\n"
みたいに、いかにも区切ってますって感じのテキストにしておきます。
こうすればテキストエディタでログを見たときにも、どこが区切りなのかすぐに分かります。
これでファイルサイズとは無関係に、必ず過去3回分までのログを保存できるようになりました。
ところでログを見るときですが、テキストエディタでももちろん大丈夫ですが、テキストログ用のビュワーというものが探すといくつも見つかります("log text viewer とかで検索すると見つかります)。
こういうのを使うと、特定の単語を含む行(例えば "ERROR" とか)を色付きで表示してくれるだとか、ログのテキストファイルをずっと監視していて、ログファイルに何か書き込まれたらすぐに反映してくれるとか、そういう便利な機能があります。
もっとも、コンソールウィンドウに色付きでログテキストを流すようになってからはそういうツールを使わなくなり、あとでログファイルを見るときも普通のテキストエディタで済ませるようになりましたけど。
こうして改めて見ると行き当たりばったりと試行錯誤の連続ですね!
HAHAHA!
(笑い事ではない)
今回もおまけのどうでもいい話。
CPU+マザボ買い替えは見送るとして、再利用可能なグラボだけでも先に買っちゃおうかなぁとPCパーツ見てみましたが、なんでグラボこんな値上がりしてるの!?
再びヤル気を失い飲んだくれるnVidia信者
今は1050ti使っているんで、せめて1650か1660あたりに……と思っていたんですが、こんなに高かったっけ?と目を疑いました。
つーか価格.comで売れ筋1位がRTX3080って嘘やろ!?(15万円ぐらいする)
どうせ高いの買うならハイエンド買っちゃえ!ということなんでしょうかね?
そーいやRyzenも5950Xとかもあの値段で売れまくって品薄なんですよね。
私の知らんところで景気良くなってるのか……?
ゲームの動作検証用に最近のRADEONも一つ欲しいなあなんて思っていたんですが、こっちも値上がりしていておいそれと手を出せそうもありません。
半導体値上がりかー。
個人レベルの同人ゲーム制作者には辛い時代ですねぇ。
冬場はマイニングPCが暖房器具代わりになるらしいんで、狙い目は夏頃……?