Capturing info log messages in D365FO. We can get it in multiple ways.
- Way 1.
public static str getError()
{
SysInfologEnumerator sysInfologEnumerator;
SysInfologMessageStruct infoMessageStruct;
str logMessage;
str logString;
str ret;
int i;
#Define.NewLine('\n')
sysInfologEnumerator = SysInfologEnumerator::newData(infolog.infologData());
while (sysInfologEnumerator.moveNext())
{
i = 1;
if (logMessage)
{
logMessage += #Newline;
}
infoMessageStruct = SysInfologMessageStruct::construct(sysInfologEnumerator.currentMessage());
while (i <= infoMessageStruct.prefixDepth())
{
logString = logString + infoMessageStruct.preFixTextElement(i) + '. ';
i++;
}
logString = logString + infoMessageStruct.message();
logMessage = logMessage + infoMessageStruct.message();
}
return logMessage;
}
- Way 2
public void method()
{
System.Exception ex;
try
{
}
catch
{
ex = CLRInterop::getLastException().GetBaseException();
error(ex.get_Message());
--- or----
System.Exception e = ex;
while (e != null)
{
errorMessage += e.Message;
e = e.InnerException;
}
}
}
- Way 3 (It fill fetch only messages from our process)
public static void main(Args _args)
{
Counter infoLogStartPos;
try
{
infoLogStartPos = infologLine();
// Your code
}
catch
{
Counter infoLogEndPos = infologLine();
str logText = Info::infoCon2Str(infolog.copy(infoLogStartPos, infoLogEndPos));
warning(logText);// You can save this log text into your table.
infoLogStartPos = infoLogEndPos + 1;
}
}
- Way 4 (Get the type of exception using the below code.)
container infologContents = infolog.cut();
for (int i = 1; i <= conLen(infologContents); i++)
{
container infologLine = conPeek(infologContents, i);
Exception errorLevel = conPeek(infologLine, 1);
str logMessage = conPeek(infologLine, 2);
if (logMessage)
{
switch (errorLevel)
{
case Exception::Error :
errors.add(logMessage);
break;
case Exception::Warning :
warnings.add(logMessage);
break;
case Exception::Info :
infos.add(logMessage);
break;
default:
Debug::assert(false);
warnings.add(logMessage);
break;
}
}
}
- Way 5
SysInfologEnumerator enumerator;
SysInfologMessageStruct msgStruct;
Exception exception;
str error;
enumerator = SysInfologEnumerator::newData(infolog.cut());
while (enumerator.moveNext())
{
msgStruct = new SysInfologMessageStruct(enumerator.currentMessage());
exception = enumerator.currentException();
error = strfmt("%1 %2", error, msgStruct.message()) + "\n";
}
- Way 6 (Return only error messages from info log)
SysInfologEnumerator sysInfologEnumerator = SysInfologEnumerator::newData(infolog.infologData());
while (sysInfologEnumerator.moveNext())
{
switch (sysInfologEnumerator.currentException())
{
case Exception::Error:
retvalue = strFmt("%1", sysInfologEnumerator.currentMessage());
break;
}
}
- Way 7
infolog.text(infologLine());
- Way 8
str errormessage;
errormessage = infolog.text(infologLine());
errormessage = infolog.text(infologLine()-1);
errormessage = errormessage + " "+ infolog.text(infologLine());
Error(errormessage);
-----------------------------------Catch API Exception-----------------------------catch (ex)
{
isSuccess = true;
if (ex is System.Net.WebException)
{
webResponse2 = (ex as System.Net.WebException).Response;
using (System.IO.StreamReader responseStream = new System.IO.StreamReader(webResponse2.GetResponseStream()))
{
str responseJson = responseStream.ReadToEnd().ToString();
if (responseJson)
{
Map map = RetailCommonWebAPI::getMapFromJsonString(responseJson);
if (map && map.exists('Message'))
{
throw Global::error(map.lookup('Message'));
}
else
{
ex = CLRInterop::getLastException().GetBaseException();
throw Global::error(ex.get_Message());
}
}
else
{
ex = CLRInterop::getLastException().GetBaseException();
throw Global::error(ex.get_Message());
}
}
}
else
{
ex = CLRInterop::getLastException().GetBaseException();
throw Global::error(ex.get_Message());
}
}
finally
{
if (isSuccess == false)
{
if (ex is System.Net.WebException)
{
webResponse2 = (ex as System.Net.WebException).Response;
using (System.IO.StreamReader responseStream = new System.IO.StreamReader(webResponse2.GetResponseStream()))
{
str responseJson = responseStream.ReadToEnd().ToString();
if (responseJson)
{
Map map = RetailCommonWebAPI::getMapFromJsonString(responseJson);
if (map && map.exists('Message'))
{
Global::error(map.lookup('Message'));
}
else
{
ex = CLRInterop::getLastException().GetBaseException();
Global::error(ex.get_Message());
}
}
else
{
ex = CLRInterop::getLastException().GetBaseException();
Global::error(ex.get_Message());
}
}
}
else
{
ex = CLRInterop::getLastException().GetBaseException();
Global::error(ex.get_Message());
}
}
}
Keep daxing!!
No comments:
Post a Comment