murs のメモ

頭の中から抜け落ちていく情報をメモがわりに書き溜めます

ColdFusionからWindowsのイベントログに書き込む実験コード

最近のブラウザではページの翻訳が簡単に表示できるようになったから、メーカーのフォーラムサイトを見ることも苦じゃなくなった。 自分の知らない情報やテクニックがあって、おおっと思うことも多いんだけど、しばらくしたら頭から抜け落ちてしまう。

その中でも、忘れずに覚えておきたいって思ったのが、4月に投稿されたCFからWindowsのEventログに書き込みたいっていう質問。

community.adobe.com

ColdFusionには、CFのログファイルに書き出す<cflog>(関数だとwriteLog())とか、任意のファイルに書き出す<cffile>(関数だとfilewrite())とかはあるけど、Windowsのイベントログに直接書き出すような機能は無い。

なので、イベントログに書き出すとしたら、<cfexecute>でバッチとかパワーシェルを呼び出して何とかできるかなと思っていた(実際に、投稿の返信で<cfexecute>でパワーシェルを実行するコードが紹介されていた)。 その後、<cfexecute>のやり方を紹介した人が<cfobject type=".NET" ...>でも出来たという実験コードを紹介してくれた。もちろん、日本語でも書き込みできる。

<cfobject type=".NET" name="eventLogClass" class="System.Diagnostics.EventLog">
<!--- Obtain an EventLog instance --->
<cfset eventLog=eventLogClass.init()>

<cfobject type=".NET" name="eventLogEntryType" class="System.Diagnostics.EventLogEntryType">
<!--- EventLogEntryType is a C# enum. "Information" type corresponds to the value 4.--->
<cfset eventLogInformationType=eventLogEntryType.Information>

<!--- The event source --->
<cfset eventSource="テストアプリ">

<!--- The event log message, which will be written as 'EventData' --->
<cfset eventMessage="あいうえお">

<!--- Write the message --->
<cfset eventLog.WriteEntry(eventSource, eventMessage, eventLogInformationType)>

実行結果

補足

上記のプログラムを動作させるには、ColdFusion .NET Service が実行されている必要がある。ColdFusionをインストールする際のオプションで「.NET Integration Services」を選択してインストールしておくか、後から、ColdFusionダウンロードページで「ColdFusion(2021 リリース).NET 統合サービスインストーラー」をダウンロードしてインストールする。

helpx.adobe.com

ColdFusionからMySQLにデータを入れると????になる場合

歳を重ねるにつれて自分が苦労して経験したこととか頭の中に入っていた情報がポロポロとこぼれおちるようになってしまった。 なので、忘れないうちにメモをしようと決めて始めたこのブログ。

ちょうど最近ハマったネタがあるので載せておこう。 外向けのColdFusionサイトの運用環境をクラウドに移行しようと考え、AWSのLightsailを触り始めた。 EC2はほとんど触ったことがないので、少しでも簡単(そうに見える)物をってことで。 ColdFusionのライセンス持ち込んで (BYOL Bring-Your-Own-Licenseで)Webサーバーとして常時動かし続ける予定なので、コスト面に有利な、なるべく簡単そう(2度目)なものを選ぶことにした(このあたりはまた別の機会にメモしようと思う)。

Lightsailは、こちらの情報などが参考になるかと techblog.nhn-techorus.com

なんとかUbuntu20.04をセットアップしてColdFusion2021をインストール。 せっかくなので、DBもLightsailに用意されているMySQL 5.7を使用することに。 データのインポートも終わり、ColdFusionにMySQL Connector/J 5.1.49ドライバを入れて接続。 データの読み込みは問題なし。でも、データを書き込んだ時に文字が?????になってしまった。

調査開始

Lightsailに用意されていたMySQL5.7の文字コードはlatin1になっていた。まあ、このあたりは想像していた通り。

けれども、スキーマを作った時にちゃんと文字コードutf8mb4にしたはずだし、その後インポートしたデータは日本語も問題なく表示できている。 実際にスキーマを確認しても問題はなさそうだ。

Lightsailではグローバル設定が変更できない

グローバル設定から変えてDBを作り直そうと思ったが、my.cnfを変えたくてもクラウドで用意されているMySQLにはSSHとかで接続できない。 AWSでは、Amazon RDSであれば「パラメータグループ」というので設定そうだが、Lightsailにはそれに相当する機能はなさそうだ。

そんな時

あきらめてUbuntuMySQLも入れてしまおうかと思ったけれども、ふと、違うJDBCドライバだったらどうなる? と思い、MariaDB Connector/Jで試したところ、読み込み時も書き込み時も文字化けは発生しなかった。

ColdFusion で MariaDB Connector/Jを使った接続方法はこちら forum.samuraiz.co.jp

そういえば、MySQL Connector/J 5.1.49を入れたけど、Maria Connector/Jは新しいドライバのほうが互換性の問題も少ないか?と思い、2.7.5を入れた。もしかしたら、5.1系のJDBCドライバだとこういう問題があるのかな? なんか、以前もこういう問題があったなあ、と、過去のメールとか自分の作業履歴を探したところ、5年前のメールから下記の記事を発見。

qiita.com

ページ中の”JDBCドライバ(Connector/J)の対応”に書かれている接続文字列(characterEncoding=UTF-8&connectionCollation=utf8mb4_general_ci)をColdFusionに登録したMySQLのデータソース設定にも 追加したらMySQL Connector/J でも文字化けすることなく書き込むことができた。

結論

読み込み時も文字化けしたらもっと早くJDBCドライバ側に目を向けたと思うんだけど、以前、MySQL Connector/J 8.0.22を使ったら server time zone のエラーが発生してハマったことがあって(接続文字列に serverTimezone=JST を入れて解決)、さらに 8.0.23以降は 日付形式が変更されたことによってMySQLから取得したdatetime型のデータをdateFormat()でフォーマット形式を指定するとエラーが発生する(https://tracker.adobe.com/#/view/CF-4211276)こともあって5.1.49にした。なので、JDBCドライバ側に問題はないでしょって思ってしまったのが今回のハマった原因でした。

追記

せっかくなので、MySQL Connector/J 8.0.23 と 8.0.29でも文字化けしないか試してみた。そうしたら、8.0.23では5.1.49と同じでデータを書き込んだ時に文字が?????になってしまったが、8.0.29では文字化けは発生しなかった。ということは、8.0.24~8.0.29のどこかで(8.0.29あたりで変更が入っているみたいだけど)この問題を解消する変更が入ったってことだけど今回はこれ以上は深追いしない。8.0.23以降で日付形式が変更された件の影響は8.0.29でも同じだった。

ColdFusion 2021 Update 4 と 2018 Update 14リリース

2022年5月10日(日本時間5月11日未明)に、ColdFusion 2021と 2018に向けた新しいUpdateがリリースされました。*1 community.adobe.com

今回のUpdateについて

機能修正などは行われず、内部ライブラリの更新や内部エンジンのTomcatのバージョンアップが行われています。

日本語の情報はこちらを見てください

その他

フォーラムのコメント読むと、今後はライブラリ等のコア部の修正と機能修正とは分けて提供していくようです。将来のバージョンではこの辺りも分けてUpdateが提供されるようになるかもしれないですね。

*1:ColdFusion 2016以前のバージョンは既にメーカーサポートが終了しており、それらバージョンのUpdateはリリースされません。セキュリティ等への備えが必要なサイトを運営されている場合は、メーカーサポートが提供されているColdFusion 2021や2018へのバージョンアップが推奨されます。