Jitsi Meet会議の開催履歴の調べ方

はじめに

Jitsi Meetには管理GUIが用意されていないため、Web画面では会議の開催履歴を確認できません。
しかし、会議室の管理や参加者の認証と権限管理、メディアセッション制御を担うJicofoコンポーネントのログに、会議の開催状況が記録されており、そのログを解析することで、会議の開催履歴を作成できそうです。

、、、といったことは、以下の記事で知りました。
ありがとうございます!

(参考)
・Jitsi Meetの会議開催状況をログ・ファイルから取得する – 枯木春開
https://shyunsei.9ten.net/2021/09/jitsi-meet.html

↑こちらにあるPHPコードですが、残念ながら、Jitsi Meetのバージョンアップによりログフォーマットが変わったようで、僕が使用したDocker版JitsiMeet バージョン 10433 では使用できませんでした。

開催履歴取得PHPコードの改修

上記参考記事内のPHPコードの改修を試みます。

Jicofoのログの中で、会議室とメンバーに関してポイントとなるのは以下の4つです。

・会議作成時の「Created new conference.」

Jicofo 2025-05-08 14:29:17.385 INFO: [1245] [room=testmeeting@muc.meet.jitsi] JitsiMeetConferenceImpl.<init>#309: Created new conference.

・会議メンバー参加時の「Member joined」

Jicofo 2025-05-08 14:29:17.857 INFO: [1419] [room=testmeeting@muc.meet.jitsi meeting_id=18de34f1-cd7f-45f5-bfd1-62fb90fe578f] JitsiMeetConferenceImpl.onMemberJoined#751: Member joined:0019b927 stats-id=Demarcus-S3B region=null audioMuted=true videoMuted=true role=PARTICIPANT isJibri=false isJigasi=false isTranscriber=false, room=main

・会議メンバー退席時の「Member left」

Jicofo 2025-05-08 15:21:53.979 INFO: [1432] [room=testmeeting@muc.meet.jitsi meeting_id=18de34f1-cd7f-45f5-bfd1-62fb90fe578f] JitsiMeetConferenceImpl.onMemberLeft#965: Member left:876dc82e

・会議終了時の「Room destroyed」

Jicofo 2025-05-08 15:21:55.311 INFO: [1430] [room=testmeeting@muc.meet.jitsi meeting_id=18de34f1-cd7f-45f5-bfd1-62fb90fe578f] JitsiMeetConferenceImpl$ChatRoomListenerImpl.roomDestroyed#2476: Room destroyed with reason=The meeting has been terminated

これらを基に、参考記事のPHPコードを改修してみました。
jitsi_meeting_history.php として保存します。

<!-- Jitsi Meet 会議開催履歴取得PHP -->
<!-- https://shyunsei.9ten.net/2021/09/jitsi-meet.html のPHPコードを改修 -->
<!-- $ docker compose logs jicofo | cut -d ' ' -f 4- > /tmp/jicofo.log -->
<!-- jicofo.log を php と同じ階層に配置して、Web経由でこのPHPにアクセスする -->
<!-- バージョン 10133, PHP 8.1 で動作確認済み -->

<html>
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width">
    <meta http-equiv="refresh" content="300";>
    <title>Jitsi log</title>
</head>

<body>
<?php
date_default_timezone_set('Asia/Tokyo');
$date = new DateTime();
print "<hr>Jitsiビデオ会議利用状況   更新日時:".$date->format('Y-m-d H:i:s')."<hr>";

function log2table($logfile) {
	$filter=['Created','Member','Room'];
	$room_used=[];
	$start_time=[];
	$total_member=[];
	$current_member=[];
	$end_time=[];

	$fp=fopen($logfile,'r');
	while (!feof($fp)) {
		$line=fgets($fp);
		$fields=explode(" ",$line);
		if ( (isset($fields[7]) && in_array($fields[7],$filter)) 
            || (isset($fields[8]) && in_array($fields[8],$filter)) ) {
            $room = preg_replace('/.* \[room=([^ ]*)@muc.meet.jitsi(.*)/i','$1',$line);
			if (!array_key_exists($room,$room_used)) {
				$room_used[$room]=0;
				$today=$fields[1];
			}
			if ($fields[7]=='Created'){
				$room_used[$room]=$room_used[$room]+1;
				$start_time[$room."#".$room_used[$room]]=$fields[1]." ".$fields[2];
				$total_member[$room."#".$room_used[$room]]=0;
				$current_member[$room."#".$room_used[$room]]=0;
			}
			if ($fields[8]=='Member'){
				if (substr($fields[9],0,6)=='joined'){
					$total_member[$room."#".$room_used[$room]]=$total_member[$room."#".$room_used[$room]]+1;
					$current_member[$room."#".$room_used[$room]]=$current_member[$room."#".$room_used[$room]]+1;
				}
				
				if (substr($fields[9],0,4)=='left'){
					$current_member[$room."#".$room_used[$room]]=$current_member[$room."#".$room_used[$room]]-1;
				}
			}

			if ($fields[8]=='Room' && $fields[9]=='destroyed'){
				$end_time[$room."#".$room_used[$room]]=$fields[1]." ".$fields[2];
				$current_member[$room."#".$room_used[$room]]=0;
			}
		}
	}
	fclose($fp);

	print '<table border=1><tr><td>会議名 #開催回</td><td>開始時刻</td><td>終了時刻</td><td>延べ参加者数</td><td>現在参加者数</td></tr>';
	foreach ($start_time as $key => $value){
      $endtime2 = "";
      if (isset($end_time[$key])) {
        $endtime2 = $end_time[$key];
      }
      if (isset($total_member[$key]) && isset($current_member[$key])) {
		print '<tr><td>'.$key."</td><td>".$value."&emsp;"."</td><td>".$endtime2."&emsp;"."</td><td>".$total_member[$key]."</td><td>".$current_member[$key]."</td></tr>";	
      }
	}
	print '</table>';
}

log2table("./jicofo.log");

?>

</body>
</html>

開催履歴取得PHPコードの使い方

以下、Docker版JitsiMeet バージョン 10433 のjicofoコンテナのログと、Linux Webサーバーの PHP 8.1 環境で確認しました。

まず、Dockerホストサーバーで、jicofoコンテナのログを取得します。
最初の3つのフィールドは、コンテナに関する情報なのでカットして、4フィールド目以降を出力します。

 $ docker compose logs jicofo | cut -d ' ' -f 4- > /tmp/jicofo.log

この jicofo.log と改修したPHPコード jitsi_meeting_history.php を、PHPが動作するWebサーバーの同じ階層に保存します。

Webブラウザから、Web経由でこのPHPにアクセスすると、以下のように、会議の開催情報がHTMLテーブル形式で表示されます。

参加メンバーの名前までは表示されませんが、この会議システムがどれぐらいの頻度で利用されているかは、把握できますね。


Jitsi Meetについて書いた記事まとめ。

タイトルとURLをコピーしました