function readOnly(count){ }
Starting November 20, the site will be set to read-only. On December 4, 2023,
forum discussions will move to the Trailblazer Community.
+ Start a Discussion
cec-yamacec-yama 

ログについて

エラー発生時にエラー内容をログファイルに出力しておき、後日ログファイルを確認する。。

force.com で上記を実現する場合の手段は何かあるでしょうか?

 

force.com の監視ログだとがそれに近いと思うのですが、

監視ログは取得できるログ数に制限があるようで、ログの内容が新しいものに上書きされてしまい

ずーと消さないで取っておくのが不可ではないかと思っております。(勝手な想像・・・)

ikouikou

ログ管理用のオブジェクトを作成して利用するというのはどうでしょうか?

 

ただ、この方法だとガバナー制限を考慮する必要があります。

(1処理内で何回もログをInsertするという書き方は望ましくない)

 

他にも何か手段があれば教えてください!

JapanJapan

投稿ありがとうございます。

やはり、オブジェクトしかないのでしょうかねえ?

 

クラウド開発の場合は、みなさんどのようにログ取得を行っているのか

ぜひ参考にしたいところです。

aki124aki124

私もカスタムオブジェクトでやってます。

 

1リクエストで大体1レコードになるように、ガバナを考慮しつつやってますが、規模が大きくなると耐えられなさそうです。

 

いい方法があれば、ぜひぜひ参考にさせていただきたいですね~

ikouikou

後はドキュメントにテキストとしてログを保存する方法ですかね。

 

ちょっと書いてみました。

 

public class myClass1{

	// ログ保存用のドキュメントフォルダーSFID
	private static final String LOG_FOLDER_ID = '00l700000012f4z'; 

	// ログ保持用
	private String tranLog = '';

	// 処理メソッド
	public void hogehoge(){
		// 適当な処理
		
		// ログをセット
		setLog('ログメッセージ1');
		setLog('ログメッセージ2');
		setLog('ログメッセージ3');
		
		// ログをドキュメントに登録
		createLog();
	}

	private void setLog(String strLog){
		tranLog += System.now().format('hh:mm:ss.SSS') + ':' + strLog + '\n';
	}

	private void createLog() {
		
		if(tranLog == null || tranLog.length()==0) return;
		
		String docName = 'ApexLog_'+System.now().format('yyyyMMddhhmmssSSS');
		Document doc = new Document(
			FolderId = LOG_FOLDER_ID,
			IsPublic = false,
			ContentType = 'text/plain',
			body = Blob.valueOf(tranLog),
			type = 'txt',
			Name = docName,
			DeveloperName = docName
		);
		
		insert doc;
		tranLog = '';
	}
}

 

ただ、ログが増えるとファイルストレージを圧迫してしまうという問題があるので、

定期的にバッチ等でログを削除してあげるといいかもしれません。

 

【余談】

前はStringに保持できる文字数制限のガバナーがあったけど、今はなくなったみたいですね。

変わり?にheap sizeで制限をかけているみたいです。