Я создал собственный тег ColdFusion для регистрации сообщений об ошибках и других строк, когда мне это нужно во время разработки.
Мой собственный тег написан на cfscript. Я стараюсь регистрировать все, что могу. Поэтому я хотел бы регистрировать новую строку всякий раз, когда я добавляю новую строку в «logMessage».
Я пытался включить переменную
crlf = chr(10) & chr(13);
Но это не работает. Я думаю, что writeLog (и соответствующий cflog) не должен добавлять новые строки?
По этой причине я пытался использовать обходной путь (используя writeLog () всякий раз, когда появляется канал), но это приводит к большим накладным расходам, потому что каждый раз, когда я запускаю writeLog (), существует очень много метаданных.
Вот мой сценарий. Первые строки оценивают заданные атрибуты (например, «logType» и объект cfcatch) и добавляют значения, если они определены, в «logMessage».
Просмотрите последние строки, содержащие цикл for.
<cfscript>
logMessageDelimiter="*******************************************************";
logMessage = "";
fileName = application.standard_log_path & application.server_name & "_standardLog";
logType = "information";
crlf = chr(10) & chr(13);
if(isDefined("attributes")){ //any attribute is given
if(isDefined("attributes.text")){ //a custom text is given
logMessage &= "LogMessage: " & attributes.text & " |" ;
}
if(isDefined("attributes.file")){ //output filename
fileName = application.standard_log_path & application.server_name & "_" & attributes.file;
}
if(isDefined("attributes.logType")){ //a loglevel type
switch(attributes.logType){
case "i":
logType = "information";
break;
case "w":
logType = "warning";
break;
case "e":
logType = "error";
break;
case "f":
logType = "fatal";
break;
default:
logType = "information";
}
}
if(isDefined("attributes.catch")){ //catch object is defined
logMessage &= "CFCATCH defined: " & " | ";
if(isDefined("attributes.catch.detail"))
logMessage &= "detail: " & attributes.catch.detail & " | ";
if(isDefined("attributes.catch.ErrorCode"))
logMessage &= "ErrorCode: " & attributes.catch.ErrorCode & " | ";
if(isDefined("attributes.catch.ErrNumber"))
logMessage &= "ErrNumber: " & attributes.catch.ErrNumber & " | ";
if(isDefined("attributes.catch.ExtendedInfo"))
logMessage &= "QueryError: " & attributes.catch.ExtendedInfo & " | ";
if(isDefined("attributes.catch.message"))
logMessage &= "message: " & attributes.catch.message & " | ";
if(isDefined("attributes.catch.RootCause"))
logMessage &= "RootCause: " & attributes.catch.RootCause & " | ";
if(isDefined("attributes.catch.TagContext"))
{
for(i=1; i LTE ArrayLen(attributes.catch.TagContext); i=i+1)
{
logMessage &= "TagContext["& i &"] Column: " & attributes.catch.TagContext[i]["Column"] & " | ";
logMessage &= "TagContext["& i &"] ID: " & attributes.catch.TagContext[i]["ID"] & " | ";
logMessage &= "TagContext["& i &"] Line: " & attributes.catch.TagContext[i]["Line"] & " | ";
logMessage &= "TagContext["& i &"] RawTrace: " & attributes.catch.TagContext[i]["Raw_Trace"] & " | ";
logMessage &= "TagContext["& i &"] Template: " & attributes.catch.TagContext[i]["Template"] & " | ";
logMessage &= "TagContext["& i &"] Type: " & attributes.catch.TagContext[i]["Type"] & " | ";
}
}
if(isDefined("attributes.catch.Type"))
logMessage &= "Type: " & attributes.catch.Type & " | ";
if(isDefined("attributes.catch.NativeErrorCode"))
logMessage &= "NativeErrorCode: " & attributes.catch.NativeErrorCode & " | ";
if(isDefined("attributes.catch.SQLState"))
logMessage &= "SQLState: " & attributes.catch.SQLState & " | ";
if(isDefined("attributes.catch.SQL"))
logMessage &= "SQL: " & attributes.catch.SQL & " | ";
if(isDefined("attributes.catch.QueryError"))
logMessage &= "QueryError: " & attributes.catch.QueryError & " | ";
if(isDefined("attributes.catch.Where"))
logMessage &= "Where: " & attributes.catch.Where & " | ";
if(isDefined("attributes.catch.ErrNumber"))
logMessage &= "ErrNumber: " & attributes.catch.ErrNumber & " | ";
if(isDefined("attributes.catch.MissingFileName"))
logMessage &= "MissingFileName: " & attributes.catch.MissingFileName & " | ";
if(isDefined("attributes.catch.MissingFileName"))
logMessage &= "MissingFileName: " & attributes.catch.MissingFileName & " | ";
if(isDefined("attributes.catch.LockName"))
logMessage &= "LockName: " & attributes.catch.LockName & " | ";
if(isDefined("attributes.catch.LockOperation"))
logMessage &= "LockOperation: " & attributes.catch.LockOperation & " | ";
if(isDefined("attributes.catch.ExtendedInfo"))
logMessage &= "ExtendedInfo: " & attributes.catch.ExtendedInfo & " | ";
}
}
splittedText = listToArray(logMessage,'|');
for(i=1; i LTE ArrayLen(splittedText); i=i+1)
{
//I really need a better solution than this loop...
writeLog(splittedText[i],logType,true,fileName);
}
writeLog(logMessageDelimiter,logType,true,fileName);
Я использую свой собственный тег так:
<cftry>
...some buggy code
<cfcatch>
<customTagName text="Hey, you've got an error!" file="myLogFile" type="e" catch="#cfcatch#">
</cfcatch>
</cftry>
В логах я получу следующий вывод (усеченный):
"Information","ajp-bio-8013-exec-37118","02/11/13","14:26:09","SYS_MYSYS","LogMessage: Hey, you've got an error!"
"Information","ajp-bio-8013-exec-37118","02/11/13","14:26:09","SYS_MYSYS","CFCATCH defined: "
"Information","ajp-bio-8013-exec-37118","02/11/13","14:26:09","SYS_MYSYS"," detail: "
"Information","ajp-bio-8013-exec-37118","02/11/13","14:26:09","SYS_MYSYS"," ErrorCode: "
"Information","ajp-bio-8013-exec-37118","02/11/13","14:26:09","SYS_MYSYS"," ErrNumber: 0 "
"Information","ajp-bio-8013-exec-37118","02/11/13","14:26:09","SYS_MYSYS"," QueryError: "
"Information","ajp-bio-8013-exec-37118","02/11/13","14:26:09","SYS_MYSYS"," message: Errormessage from CF telling me my errors "
"Information","ajp-bio-8013-exec-37118","02/11/13","14:26:09","SYS_MYSYS"," TagContext[1] Column: 0 "
"Information","ajp-bio-8013-exec-37118","02/11/13","14:26:09","SYS_MYSYS"," TagContext[1] ID: CF_CFPAGE "
"Information","ajp-bio-8013-exec-37118","02/11/13","14:26:09","SYS_MYSYS"," TagContext[1] Line: 183 "
"Information","ajp-bio-8013-exec-37118","02/11/13","14:26:09","SYS_MYSYS"," TagContext[1] RawTrace: at cffileecfm1278323672._factor2(/the/path/to/my/file.cfm:183) "
"Information","ajp-bio-8013-exec-37118","02/11/13","14:26:09","SYS_MYSYS"," TagContext[1] Template: /the/path/to/my/file.cfm"
"Information","ajp-bio-8013-exec-37118","02/11/13","14:26:09","SYS_MYSYS"," TagContext[1] Type: CFML "
...
"Information","ajp-bio-8013-exec-37118","02/11/13","14:26:09","SYS_MYSYS","*******************************************************"
Так ты бы сделал? Есть ли способ получить новую строку, не выполняя writeLog () снова и снова.
Хотелось бы увидеть такой результат:
"Information","ajp-bio-8013-exec-37118","02/11/13","14:26:09","SYS_MYSYS","LogMessage: Hey, you've got an error!"
"CFCATCH defined: "
" detail: "
" ErrorCode: "
" ErrNumber: 0 "
" QueryError: "
" message: Errormessage from CF telling me my errors "
" TagContext[1] Column: 0 "
" TagContext[1] ID: CF_CFPAGE "
" TagContext[1] Line: 183 "
" TagContext[1] RawTrace: at cffileecfm1278323672._factor2(/the/path/to/my/file.cfm:183) "
" TagContext[1] Template: /the/path/to/my/file.cfm"
" TagContext[1] Type: CFML "
...
"*******************************************************"
Я мог бы использовать методы для записи в файл, но я думаю, что это тоже не лучший способ, не так ли? Вдобавок: я не могу писать в стандартную папку журнала (например, / path / to / coldfusion / instancename / logs / myLogFolder) ColdFusion из моего приложения ?!
Есть ли способ структурировать мои файлы журналов? У тебя есть идея?
1 ответ
Нет. Я только что проверил, что CF заменяет символы CRLF пробелами. Вот и все. Я предполагаю, что это делается для того, чтобы синтаксический анализатор журнала мог предположить, что CRLF обозначает конец записи журнала, не беспокоясь о том, что он является частью сообщения журнала. Это немного ленивый CF, IMO. Интересно, что Райло этого не делает.
Лучшее, что вы можете сделать, - это вставить какой-нибудь другой символ ASCII (я только что протестировал chr (30) - RECORD SEPARATOR) вместо этого и написать программу просмотра журнала, которая меняет его местами на CRLF. Это не очень хорошее предложение, но если это важно для вас, это вариант.
Похожие вопросы
Новые вопросы
logging
Регистрация данных в компьютере - это процесс записи событий в компьютерной программе или компьютерной системе, обычно с определенной областью действия, чтобы обеспечить контрольный журнал, который можно использовать для понимания деятельности системы и диагностики проблем. Не забудьте включить соответствующие теги программного или аппаратного обеспечения в дополнение к этому тегу.
Chr(13) & Chr(10);
не наоборот