尝试使用cflog将信息保存到日志中,并以JSON格式保存。但由于某种原因,在每个已经存在的dbl-quote旁边添加了一个额外的dbl-quote。
示例:我这样做,将一个简单的结构体转换为JSON字符串:
<cfset local.fname = "Max">
<cfset local.lname = "Smith">
<cfset local.id = "QA-123">
<cflog text="#serializeJSON(local)#">
在日志中,它被保存为:
"INFO","http-apr-8888-exec-6","10/04/2021","19:24:46","","{""fname"":""Max"",""lname"":""Smith"",""id"":""QA-123""}"
如果我试图挽救它,我没有报价,因此无效的JSON。
<cflog text='{fname:Max,lname:smith,id:QA-123}'>
结果:
"INFO","http-apr-8888-exec-6","10/04/2021","19:24:46","","{fname:Max,lname:Smith,id:QA-123}"
和
<cflog text='{"fname":"Max","lname":"smith","id":"QA-123"}'>
的结果与第一个示例相同:
"INFO","http-apr-8888-exec-6","10/04/2021","19:24:46","","{""fname"":""Max"",""lname"":""Smith"",""id"":""QA-123""}"
为什么这样做,我如何结束我想要的日志条目,没有任何额外的引号?:
"INFO","http-apr-8888-exec-6","10/04/2021","19:24:46","","{"fname":"Max","lname":"Smith","id":"QA-123"}"
我们正在运行CF10(旧版本,因为我们正在逐步淘汰CF),并通过Splunk查看日志。不确定Splunk是否是CSV解析器,但找到了一种方法,可以按需要编写日志。
创建一个名为writeLog()的函数,使用Java sys.out.println代替cflog标签:
<cfscript>
function writeLog(required message) {
var logString = serializeJSON(arguments);
sys.out.println('{"timestamp":"#dateTimeFormat(now(), "yyyy-mm-dd'T'hh:mm:ss:ssssssZ")#",#Right(logString, Len(logString) - 1)#');
}
</cfscript>
然后这样命名:
<cfscript>
var emailData = structNew();
emailData.toAddress = ARGUMENTS.to;
emailData.fromAddress = ARGUMENTS.from;
emailData.subject = ARGUMENTS.subject;
APPLICATION.general.writeLog(message="Sending email", argumentCollection=emailData);
</cfscript>
并且(对Splunk进行一些调整)生成的日志看起来像:
{
FROMADDRESS: no-reply@blah.com
SUBJECT: Welcome to the team
TOADDRESS: someone@example.com
message: Sending email
timestamp: 2021-10-05T11:10:21:000021-0400
}
我已经看过你的问题了。是的,我们有Coldfusion 11, Coldfusion 2016. 但不在Coldfusion 2018(更新12). 可能他们在Coldfusion 2018的最新更新中修复了这种情况。
请尝试将您的版本更新到最新,然后检查这些问题。
但是现在,我可以用replace()方法给你一些解决方法。
示例代码:
<cfset myStr = {} >
<cfset myStr.fname = "Kannan">
<cfset myStr.lname = "Pasumpon">
<cfset myStr.id = "CF-123">
<cfset jsonData = replace(serializeJSON( myStr ), '"',"'","All")>
<cflog text="#jsonData#" file="testingWorks">
这里我只是用单引号替换了所有的双引号值。并将其记录在testingWorks.log文件中。新的结果如下所示,
Result In Log File:
"Information","http-nio-8501-exec-6","10/05/21","12:21:04","","{'LNAME':'Pasumpon','ID':'CF-123','FNAME':'Kannan'}"
同样,你可以根据自己的需要来实现这些事情。
注意:解决这种情况下默认更新版本。所以我建议你先更新你的版本,而不是更改/替换注释。