Я создал собственный тег 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 из моего приложения ?!

Есть ли способ структурировать мои файлы журналов? У тебя есть идея?

2
derroman 11 Фев 2013 в 17:57
2
К вашему сведению, CRLF Chr(13) & Chr(10); не наоборот
 – 
duncan
11 Фев 2013 в 18:14
Как вы думаете, почему cflog и writelog не добавляют новую строку?
 – 
Dan Bracuk
11 Фев 2013 в 18:33
Я почти уверен, что CFlog и WriteLog будут экранировать или игнорировать символы новой строки. Обычно это именно то, что вам нужно, поскольку вы получаете по одной строке на запись. Поскольку вы уже ведете журнал через один тег, вы можете использовать File API для прямой записи в файл в желаемом формате.
 – 
barnyr
11 Фев 2013 в 18:54
Если вам действительно нужен такой уровень контроля над выводом, возможно, поработайте свой собственный CFC журналирования с помощью cffile action = "write" или fileWriteLine?
 – 
Barry
12 Фев 2013 в 08:08
Я думаю, что файловый API - это возможность, но я просто хотел найти способ использовать cflog соответственно writeLog (). Но все равно спасибо.
 – 
derroman
12 Фев 2013 в 16:17

1 ответ

Лучший ответ

Нет. Я только что проверил, что CF заменяет символы CRLF пробелами. Вот и все. Я предполагаю, что это делается для того, чтобы синтаксический анализатор журнала мог предположить, что CRLF обозначает конец записи журнала, не беспокоясь о том, что он является частью сообщения журнала. Это немного ленивый CF, IMO. Интересно, что Райло этого не делает.

Лучшее, что вы можете сделать, - это вставить какой-нибудь другой символ ASCII (я только что протестировал chr (30) - RECORD SEPARATOR) вместо этого и написать программу просмотра журнала, которая меняет его местами на CRLF. Это не очень хорошее предложение, но если это важно для вас, это вариант.

3
Leigh 11 Фев 2013 в 20:42
Я обнаружил ошибку для этого: bugbase.adobe.com/index.cfm ? event = bug & id = 3498448
 – 
Adam Cameron
11 Фев 2013 в 19:19
Спасибо за подтверждение моей гипотезы и спасибо за сообщение об ошибке. Я буду следить за этим.
 – 
derroman
12 Фев 2013 в 16:15