Using gs.log from scoped apps

There are different ways of logging in ServiceNow, but one cool thing about using gs.log() is that you can specify a second argument, source which shows up as a separate column in the syslog table. This makes it easy to filter for your logs.

But ServiceNow seems to want to discourage you from using gs.log, because you're not allowed to use it from a scoped app. If you try, you'll get this warning:

Evaluator.evaluateString() problem: com.glide.script.fencing.MethodNotAllowedException: Function log is not allowed in scope x_bits2_az_openai. Use gs.debug() or instead:

So ServiceNow wants us to use and gs.debug here, but those methods don't let you specify the source property. So once again it is tricky to filter for your logs.

I found a workaround for this. It's not the most beautiful workaround, but in some cases it might be useful enough.

Basically you can leverage the fact that you can invoke gs.log via a globally scoped script include. And you can use the GSLog script include, because it comes pre-installed on all instances. So you can still ship your app as a stand alone scoped app.

This is what it looks like:

var gl = new global.GSLog(
	'x_company_app_name.logging.verbosity', // sys_properties key set to 'debug'
	'Specify Source Here' // Source
gl.log('debug', 'Your message');

This is what it looks like in the logs (note the source column)

The unfortunate thing is that you cannot get rid of the "[DEBUG]" prefix in the message and you cannot get rid of the "*** Script " prefix in the source. But other than that it works as it does in global scope and might be useful in some cases.