You can't call native api methods which write to device as is.

If you need to call some piece of code which writes to device use this wrapper:

/// Executes and returns device output 
/// pObj - OREF or class
/// pMethod - instance or class method to execute respectively
/// pArgs - additional arguments
ClassMethod OutputToStr(pObj, pMethod, pArgs...) As %String [ ProcedureBlock = 0 ]
{
	set tOldIORedirected = ##class(%Device).ReDirectIO()
	set tOldMnemonic = ##class(%Device).GetMnemonicRoutine()
	set tOldIO = $io
	try {
		set str=""

		//Redirect IO to the current routine - makes use of the labels defined below
		use $io::("^"_$ZNAME)

		//Enable redirection
		do ##class(%Device).ReDirectIO(1)

		if $isobject(pObj) {
			do $Method(pObj,pMethod,pArgs...)
		} elseif $$$comClassDefined(pObj) {
			do $ClassMethod(pObj,pMethod,pArgs...)
		}
	} catch ex {
		set str = ""
	}

	//Return to original redirection/mnemonic routine settings
	if (tOldMnemonic '= "") {
		use tOldIO::("^"_tOldMnemonic)
	} else {
		use tOldIO
	}
	do ##class(%Device).ReDirectIO(tOldIORedirected)

	quit str

	//Labels that allow for IO redirection
	//Read Character - we don't care about reading
rchr(c)      quit
	//Read a string - we don't care about reading
rstr(sz,to)  quit
	//Write a character - call the output label
wchr(s)      do output($char(s))  quit
	//Write a form feed - call the output label
wff()        do output($char(12))  quit
	//Write a newline - call the output label
wnl()        do output($char(13,10))  quit
	//Write a string - call the output label
wstr(s)      do output(s)  quit
	//Write a tab - call the output label
wtab(s)      do output($char(9))  quit
	//Output label - this is where you would handle what you actually want to do.
	//  in our case, we want to write to str
output(s)    set str=str_s   quit
}

So in your case it would be something like:

IRISObject data  = (IRISObject) iris.classMethodObject(CACHE_CLASS_NAME, method, _args);
String string = iris.classMethodString("SomeClass", "OutputToStr", data, "ToJSON")
data.close();

If you check Ens.Util.Log class where logs are stored, you'll notice that Text property is limited to 32 000 characters, so logging anything larger than that is impossible.

There are several approaches you can take:

  • Logging to files as described by @Jeffrey Drumm. I'd add that you can use %File:TempFilename to obtain a random but valid filename to write to. Alternatively use session id and timestamp to create the filename, with each session having a separate folder.
  • Logging to streams. Use %Stream.GblChrCompress to save on space. JSON is very compressible.
  • Use a debugging business operation. Create a business operation which accepts everything and either defers or just does nothing. Send a copy of your stream there. This way you get immediate access to a content from the Visual Trace.
docker pull containers.intersystems.com/intersystemscorp/iris-community:2021.2.0.649.0

is probably

docker pull containers.intersystems.com/intersystems/iris-community:2021.2.0.649.0

Interesting news. Question: as access to containers.intersystems.com requires a WRC account, how do prospects/new users/people without WRC access can get community version of InterSystems IRIS?