macOSのログをSynology NASへ自動保存する方法|NAS未接続時はMac内に一時保存

MacのログをSynology NASへ自動保存する方法を紹介するサムネイル。Mac miniからNASへログファイルを転送し、24時間ごとの収集と接続復帰後の自動転送を表現。 パソコン
macOSのログをNASへ自動保存。NASがオフラインでもMac内に一時保存し、接続復帰後に自動転送します。

macOSを長期間運用していると、「昨日エラーが出た原因を後から調べたい」「ネットワーク障害が発生した時間帯のMac側ログを確認したい」といった場面があります。

しかし、必要なときにログを取り始めても、すでに問題が発生した後では遅いことがあります。

そこで今回は、macOSのUnified Logから「error」「fault」を定期的に収集し、gzip圧縮してSynology NASへ自動保存する仕組みを作ります。

この方法ではNASが一時的に切断されていても問題ありません。いったんMac内部へ保存し、NASが再接続されたときに未転送分を自動的にまとめて送ります。

今回の構成は次のようになります。

今回作る仕組み

今回のスクリプトは、24時間ごとにmacOSのエラー系ログを収集します。

実際の処理は5分ごとにlaunchdから起動されますが、毎回ログを作るわけではありません。前回収集から24時間経過している場合だけ新しいログを作成します。

NASへの転送は5分ごとに確認されるため、ログ作成時にNASが切断されていても、その後NASがマウントされれば自動的に転送されます。

保存されるファイル名は次のようになります。

NAS側では一定期間が経過したログを自動削除するようにし、今回は90日保存としています。

保存先フォルダを作成

まずNAS側にログ保存用フォルダを作成しておきます。

今回の例では、

を使用します。

Mac側では未転送ログを次の場所へ保持します。

へ保存します。

続いて、

を実行します。

以下を貼り付けます。

保存は、

です。

その後、実行権限を付けます。

なお、NASのフォルダ名に日本語を使用している場合、macOSでは濁点・半濁点のUnicode表現が見た目と内部で異なることがあります。

NASパスは手入力するより、Finderやターミナル上で実際のパスを確認して指定するのがおすすめです。

修正版で重要なポイント

最初に作ったバージョンでは、NASへコピーするときに、

としていました。

つまりNAS上では一時的に、

というファイルを作っていました。

先頭が「.」なのでUnix系OSでは隠しファイルとして扱われます。

コピー完了後に通常のファイル名へ変更していたのですが、Synology NASへSMB経由で保存した場合、隠し属性がリネーム後にも残るケースがありました。

その結果、

という少し分かりにくい状態になりました。

今回の修正版では、

としています。

これならコピー途中は、

となり、隠しファイルにはなりません。

コピー後にcmpで元ファイルとNAS側の一時ファイルを比較し、正常であれば正式な.log.gzへリネームします。

途中でNAS接続が切れた場合も、完成していないファイルを正常なログとして扱う可能性を抑えられます。

手動で動作確認する

まず現在の状態を確認します。

強制的にログを1回作成する場合は、

を実行します。

正常であれば、

のようなファイルがNAS側へ作成されます。

スクリプト自身の動作履歴は、

で確認できます。

正常時は例えば、

のようになります。

NASを切断した状態でもテストできる

この仕組みのポイントは、NASが使えない状態でもログ収集そのものは継続できることです。

NAS未接続時には、

.log.gzが残ります。

確認するには、

を実行します。

NASを再接続したあと、

とすれば、未転送分だけNASへ転送できます。

launchdを設定すれば、このflushも手動で行う必要はありません。

launchdで完全自動化する

macOSにはWindowsのタスクスケジューラに相当するlaunchdがあります。

LaunchAgentを作ります。

以下を貼り付けます。

文法をチェックします。

正常なら、

と表示されます。

登録します。

すでに登録済みの設定を更新するときは、

とします。

登録状態は、

で確認できます。

5分間隔でもログを5分ごとに作るわけではない

StartIntervalを300秒にしています。

そのためlaunchdからスクリプト自体は約5分間隔で起動します。

ただしログ収集部分には、

という判定が入っています。

そのため実際の動作は、

となります。

NAS復帰を比較的早く検出しつつ、ログファイル自体は1日1個程度に抑えられます。

NASへ本当に保存されているか確認する

macOSの/Volumes配下には、NAS未接続時に同名フォルダが残ってしまうケースも考えられます。

そのため、保存先が本当にSMBマウントなのか確認するには、

を実行します。

例えば、

のように(smbfs, ...)と表示されれば、Synology NASへSMB接続されています。

さらに、

でも確認できます。

Finderにログが表示されない場合

NAS上ではログが存在するのにFinderだけ表示されない場合、隠し属性が付いている可能性があります。

今回、旧バージョンのスクリプトで実際にこの状態になりました。

確認は、

です。

隠し属性を解除する場合は、

を実行します。

Finderを再起動する場合は、

です。

ただし、今回掲載している修正版では一時ファイルを先頭ドット付きで作らないため、新規ログについては同じ問題が発生しにくくなっています。

ログを見る方法

.log.gzなので、ダブルクリックして展開しても構いません。

ターミナルから内容だけ確認するなら、

でも確認できます。

キーワードを絞るなら、

なども使えます。

まとめ

この方法なら、macOSで発生したerror・faultログを毎日自動的に蓄積できます。

NASが停止している場合でもログ収集自体は止まらず、Mac内部のpendingフォルダへ待避します。NASが再びマウントされた後はlaunchdが自動的に未転送ログを検出して送信します。

特に、自宅サーバーやNAS、ルーターなどを含めてネットワーク障害の原因を後から調べたい場合、Mac側にも継続的なログが残っているとかなり役立ちます。

今回のようにSynology NAS側でルーターのsyslogも保存しておけば、

 

を同じ時間軸で比較できるため、「インターネット側の問題なのか」「LAN側なのか」「Mac側なのか」といった切り分けもしやすくなります。

なお、macOSのログにはユーザー名、ファイルパス、アクセス先などが含まれる場合があります。

取得した生ログをブログやSNSへそのまま公開する場合は、個人情報が含まれていないか確認してから掲載した方が安全です。

 

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