通知機能とファイルへの保存

エラーが発生した際、問題にすぐに気がつけるように監査ログ機能には通知機能がついており、設定したログレベル以上のログが発生すると、メールで通知してくれます。 また、データベースにログは保存しているのですが、ファイルにも書き出すことが出来るようになっております。

設定方法

a-blog cms設置ディレクトリにある「.envファイル」で設定を行います。

# エラー通知
ALERT_EMAIL_FROM=info@example.com # エラー通知メールの送信元
ALERT_EMAIL_TO= # エラー通知メールの送信先。空の場合「UID」が一番小さい管理者アカウントのメールアドレスに送信します。
ALERT_EMAIL_BCC= # カンマ区切りで指定
ALERT_REPORTING_LEVEL=WARNING # エラー通知をする最低ログレベルを設定します。(DEBUG|INFO|NOTICE|WARNING|ERROR|CRITICAL|ALERT)

# ロガー
LOGGER_ROTATING_MAX_FILES=60 # ログローテーションの日数を設定します。
LOGGER_MODE=development # (development|production) productionに設定すると、ライセンス切れやデバッグモード時なども、ログとして残します


設定項目 説明 デフォルト値
ALERT_EMAIL_FROM エラー通知メールの送信元 info@example.com
ALERT_EMAIL_TO エラー通知メールの送信先。空の場合「UID」が一番小さい管理者アカウントのメールアドレスに送信します
ALERT_EMAIL_BCC エラー通知メールのBCC
ALERT_REPORTING_LEVEL エラー通知をする最低ログレベルを設定します WARNING
LOGGER_ROTATING_MAX_FILES ログローテーションの日数を設定します 60
LOGGER_MODE productionに設定すると、ライセンス切れやデバッグモード時なども、ログとして残します development

モード

LOGGER_MODEはデフォルトだと「development」になっています。この状態だと、ライセンスに問題があった場合などログが残らず通知もしてくれないので、本番環境では必ず「production」に設定しましょう。

また本番環境での「LOGGER_MODE」の変更し忘れを防止するため、「development」に設定されている時はダッシュボードと監査ログページに以下の表示がされるようになっています。


ダッシュボード

ダッシュボード


監査ログページ

監査ログページ


ファイルへの保存

デフォルトで、ログはデータベースに書き出されますが、ファイルに書き出すことも可能です。ログの書き出し先は「config.server.php」で設定します。

ファイルに書き出されるログは「NOTICE」以上のログになります。

例えば、ドキュメントルートの一階層上の「logs」ディレクトリに「acms.log」という名前で保存する場合は、以下のように指定します。

define('ERROR_LOG_FILE', '../logs/acms.log');

ログファイルは、1日に1ファイル作成され、ログローテーション日数に指定されたファイル数作成されます。 ログローテーション日数を超えた場合は、古いファイルが削除され新しいファイルが作成されます。

LOGGER_ROTATING_MAX_FILES=60 # ログローテーションの日数を設定します。

以下は、ファイル名を「acms.log」とした場合のログファイル作成例になります。

acms-2023-09-28.log
acms-2023-09-29.log
acms-2023-09-30.log
acms-2023-10-01.log
acms-2023-10-02.log
...

開発者向け

専用モジュールやHookなどを使用して、PHPをカスタマイズしている方もいると思います。 そんな方には、以下の方法を使うことで自分のプログラムにログを追加できるようになります。

基本的な使い方

  • 保存したいログレベルのメソッドを呼び出す
  • 第1引数: メッセージ文字列
  • 第2引数: 保存したい情報(連想配列)
AcmsLogger::[ログレベル](string $message, array $info);

// 例
AcmsLogger::info('xxxを作成しました', [
  'hoge' => 'abc',
  'hoge2' => 200,
]);

use して使う場合

use Acms\Services\Facades\Logger;

Logger::info('xxxx');

コード例

メッセージだけ指定

\AcmsLogger::critical('重大な問題により動作を停止しました');

例外をログとして残す

「Common::exceptionArray()」を第2引数に指定すると、例外の詳細な情報を渡してくれます。

try {
...
} catch ( \Exception $e ) {
    \AcmsLogger::warning($e->getMessage(), \Common::exceptionArray($e));
}

このログは通常のログと同じように表示や通知などに利用できますので、PHPでカスタマイズを行っている方はぜひお試しください。

エントリーの排他制御機能(編集ロック機能)

Ver. 3.1.0 以上のプロフェッショナル・エンタープライズライセンスで、エントリーにロックがかけれるようになりました。これにより意図しないエントリーの上書きでのデータ消失のリスクが減ります。

動作の流れ

エントリーを編集していて、保存ボタンを押すまでは、編集中のエントリーにロックが自動でかかります

ロック中は、以下のスクリーンショットのように、エントリー一覧からロックがかかっていることが分かるようになっています。 自分がロックしている場合と、他のユーザーがロックしている場合で、違うアイコンが表示されるようになっています。


自分がロックしている場合の表示

自分がロックしている場合の表示


他のユーザーがロックしている場合の表示

他のユーザーがロックしている場合の表示


自分ではない他のユーザーが、編集中(ロック中)のエントリーの編集画面を開くと、以下のようなスクリーンショットが表示され、ロックしているユーザーや編集日時がわかるようになっています。


ロック中に表示されるアラート

ロック中に表示されるアラート


アラートを閉じれば、この状態でもエントリーの編集は可能になっておりますが、保存をすると以下スクリーンショットのエラーが出て保存できないようになっています。ではなぜ編集できるようになっているかというと、違うバージョンでの保存はロックがかかっていても保存はできるためになります。


ロック中のエントリーを保存した時のアラート

ロック中のエントリーを保存した時のアラート


エントリーの編集中に編集をやめページを離脱した場合はロックが残ってしまいます。このような時は、再度エントリー編集ページを開いて保存をするか、以下スクリーンショットにあるようにエントリー一覧から、ロックアイコンをクリックするこで、ロックを解除することが出来ます。


ロックの解除

ロックの解除


コンフィグ設定

管理ページ > コンフィグ > 機能設定に「エントリー同時編集ロック」のコンフィグがあります。

  • 同時編集ロック機能:チェックをつけると機能が有効になり、外すと機能が無効になります。
  • アラートのみ:チェックをつけると、ロックされている事のアラートは表示されますが、アラートを無視して保存できるようになります
  • ロック有効期限:ロックの有効期限を設定します。この期間を過ぎたロックは自動的に解除されます。

エントリー同時編集ロックのコンフィグ

エントリー同時編集ロックのコンフィグ

ログイン状態に応じて表示・非表示を制御する

会員制サイトの制作時に活用できる、ログイン状態に応じて要素の表示・非表示を制御するためのJavaScriptです。

会員制サイトの制作時に、読者ユーザーがログインしている状態でページキャッシュを有効にした設定をしている場合、タッチモジュールやグローバル変数での制御だけでは、意図しないユーザー情報がキャッシュされ、読者ユーザーがログインしているにも関わらず、ログインしていない状態のHTMLが表示されることがあります。

この問題を解決するため、JavaScriptでログイン状態を判定するプログラムの記述が必要です。この組み込みJSを利用することで、ログイン状態に基づいた表示・非表示の制御が可能です。

使い方

ログイン状態に応じて、表示・非表示の制御をしたい要素に以下のクラスを追加してください。

ログイン状態に応じて、display: none 及び display: block のCSSが適用されます。



クラス名 説明
js-login-hidden ログイン状態の時、非表示にする
js-login-show ログイン状態の時、表示する
js-logout-hidden ログアウト状態の時、非表示にする
js-logout-show ログアウト状態の時、表示する
<div class="js-login-hidden">
  <!-- ログイン時に非表示になります -->
</div>
<div class="js-login-show">
  <!-- ログイン時に表示されます -->
</div>
<div class="js-logout-hidden">
  <!-- ログアウト時に非表示になります -->
</div>
<div class="js-logout-show">
  <!-- ログアウト時に表示されます -->
</div>

表示時に適用される display プロパティの値を変更する

js-login-showjs-logout-show といったクラスは、ログイン状態に応じて要素を表示する機能として、デフォルトで display: block のスタイルが適用されます。しかし、display: flex など、別の値を適用したい場合があるかもしれません。

そういった場合には、data-display 属性を用いて適用する値を変更することができます。

<div class="js-login-show" data-display="flex">
  <!-- ログイン時にdisplay: flexのスタイルが適用されます -->
</div>
<div class="js-logout-show" data-display="grid">
  <!-- ログアウト時にdisplay: gridのスタイルが適用されます -->
</div>

デフォルトの設定

この機能の設定は、/js/config.jsの以下の箇所にあります。

  //----------------------------
  // ログイン状態による表示・非表示
  loginHiddenMark: '.js-login-hidden', // ログイン状態の時、非表示にする
  loginShowMark: '.js-login-show', // ログイン状態の時、表示する
  logoutHiddenMark: '.js-logout-hidden', // ログアウト状態の時、非表示にする
  logoutShowMark: '.js-logout-show', // ログアウト状態の時、表示する

モーダルダイアログ

任意のページ(HTML)をモーダルダイアログで表示します。

主にモジュールIDやブログ、カテゴリーを閲覧ページ上からモーダルダイアログで編集するために利用されています。

デフォルトの設定

この機能の設定は、/js/config.jsの以下の箇所にあります。

  dialogBtnMark: '.js-dialog-btn',
  dialogTitleMark: '.js-dialog-title',
  dialogBodyMark: '.js-dialog-body',

設定の詳細は以下になります。



設定項目 説明
dialogBtnMark モーダルダイアログを表示するボタン要素をセレクター形式で設定します。
dialogTitleMark モーダルダイアログのタイトルとして表示される要素をセレクター形式で設定します。
dialogBodyMark モーダルダイアログの本文として表示される要素をセレクター形式で設定します。

使い方

dialogBtnMark で指定した要素の href 属性で任意のページ(HTML)を指定することで、実装できます。

例として、ブログフィールドモジュール内で以下のテンプレートを読み込むことで管理者ユーザーの場合、モーダルダイアログでブログを編集する機能を実装しています。

<!-- BEGIN_MODULE Touch_SessionWithAdministration -->
<p class="acms-admin-module-edit acms-admin-module-edit">
  <!-- BEGIN module_setting -->
  <a href="/bid/{id}/admin/blog_edit/#acms_custom" class="js-dialog-btn js-link_no_rewrite">編集する</a>
  <!-- END module_setting -->
</p>
<!-- END_MODULE Touch_SessionWithAdministration -->