본문 바로가기
TechNical/WMI

로그보기힘들어요

by 강멍멍이 2023. 3. 28.
반응형

로그파일이... 너무 보기 힘들어서 만듬.

혹시라도 그럴 일이 없을 것 같지만, 나중에 딴대서 써 먹을 수도 있을 것 같아서 올려둠.

 

1. 로그 파일을 다운로드 받는 경우 타겟 디렉토리에서 가장 최근에 생성된 파일을 읽어 온다. 수기 입력도 된다.

2. 로그파일내에서 내가 보고자 하는 키값이 포함된 라인만 화면에 출력한다.

3. MyBatis 형식의 SQL과 파라메터가 포함되어 있다면 맵핑해 준다.

4. Excpetion이 발생할 경우 Git 사이트가 구축되어 있다면 링크를 걸어 준다.

 

<meta content="ie=edge" charset="utf-8"/>
<html>
 <head>
  <title>로그보기힘들어요</title>
  <HTA:APPLICATION
       ID="MUNGMUNG"
       APPLICATIONNAME="로그보기힘들어요 Ver 1.1"
       SCROLL="no"
       SINGLEINSTANCE="yes"
       WINDOWSTATE="normal"
  >
 
  <style>
   BODY
   {
      background-color: buttonface;
      font-family: Helvetica;
      font-size: 10pt;
      margin-top: 5px;
      margin-left: 5px;
      margin-right: 5px;
      margin-bottom: 5px;
   }   
   
   .button
   {
      font-family: Helvetica;
      font-size: 8pt;
      width: 92px;   
   }
   
   textarea
   {
      font-family: arial;
      font-size: 10pt;
   }
   
   select
   {
      font-family: arial;
      font-size: 10pt;
      width: 200px;
      margin-left: 0px;
   }      

    hr {
        height: 12px;
        background-color: gray;
        border: 0px;
    }
  </style>
 
  <script language="VBScript">  
    Sub Window_Onload         
        window.resizeTo 1600,1000
          'window.moveTo 100, 50
    End Sub

    Sub Run
        On Error Resume Next

        IF chkAuto.checked = "True" THEN
            Const adVarChar = 200
            Const MaxCharacters = 255
            Const adFldIsNullable = 32

            convPath = REPLACE(inpPreFixPath.value, "\", "\\")

            strComputer = "."
            Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
            Set colFiles = objWMIService.ExecQuery("Select * from CIM_DataFile where drive='" & inpPreFixDrive.value & "' and path='" & convPath & "' and name like '%" & inpPreFixName.value & "%'")
            Set DataList = CreateObject("ADOR.Recordset")
            DataList.Fields.Append "FileName", adVarChar, MaxCharacters, adFldIsNullable
            DataList.Fields.Append "ModifiedDate", adVarChar, MaxCharacters, adFldIsNullable
            DataList.Open
            For Each objFile In colFiles
                'msgbox objFile.Name & " " & objFile.path & " " & objFile.drive
                DataList.AddNew
                DataList("FileName") = objFile.Name
                DataList("ModifiedDate") = objFile.LastModified
                DataList.Update
            Next
            DataList.Sort = "ModifiedDate DESC"
            inpFilename.value = DataList.Fields.Item("FileName")
        END IF

        if Len(inpUUID.value) = 0 then
            msgbox "UUID 안 넣으면 엄청 느려 질 수 있다!!! 뻗을 수도 있다!!"
        end if

        targetID = "[" & inpUUID.value & "]"
        startDeli = "|"
        resultStr = ""
        paramStr = inpSkip.value
        arrSkip = Split(replace(paramStr, " ", ""), "/")

        sqlKeep = "N"
        sqlText = ""
        targetChar = "?"

        exceptionFlag = "N"

        showJavaFileName = "N"

        IF chkShowJavaFileName.checked = "True" THEN
            showJavaFileName = "Y"
        END IF

        lineCnt = 0

        IF chkBBUCK.checked = "True" THEN '----------------------------------------------------------------------------------------------------------------------------
            
            '파일 읽는 속도는 빠른데 UTF-8 지원이 안 되서 한글이 깨지는 치명적인 결점이 있다.
            Const ForReading = 1
            Const ForWriting = 2
            Set objFSO1 = CreateObject("Scripting.FileSystemObject")
            Set objFile1 = objFSO1.OpenTextFile(inpFilename.value, ForReading)

            Do Until objFile1.AtEndOfStream
                strLine = objFile1.ReadLine                
                skipFlag = "N"

                strLine = replace(strLine, "&", "&amp;")
                strLine = replace(strLine, "<", "&lt;")
                strLine = replace(strLine, ">", "&gt;")                

                lineCnt = lineCnt + 1

                If InStr(strLine, targetID) > 0 OR Len(inpUUID.value) = 0 then

                    if exceptionFlag = "Y" then
                        resultStr = resultStr & "</pre>"
                        exceptionFlag = "N"
                    end if

                    'exception 발생하면 쭉 찍어 줘야 한다. (그 밑으로 UUID 없이 로그가 찍힌다.)
                    if InStr(strLine, "][E][") > 0 then 
                        exceptionFlag = "YF"
                    end if

                    For Each skipStr in arrSkip
                        If InStr(strLine, skipStr) > 0 Then                    
                            skipFlag = "Y"
                        End If
                    Next

                    If skipFlag = "N" OR chkIgnore.checked = "False" then
                        strJava = ""
                        IF showJavaFileName = "Y" THEN
                            strJava = Replace(Mid(strLine, 29, 22), " ","")
                        END IF

                        strTime = Mid(strLine, 1, 25)
                        startPos = InStr(strLine, startDeli) + 1
                        IF Len(inpUUID.value) > 0 THEN
                            strLine = Mid(strLine, startPos, Len(strLine))
                        END IF

                        if (InStr(strLine, " REQUEST : ") > 0) then                            
                            resultStr = resultStr & "<br><hr>"
                            strLine = convertPequest(strLine)
                        end if

                        if (InStr(strLine, "  Preparing:") > 0) then
                            sqlText = convertSql(strLine)
                            strLine = sqlText
                        end if

                        if (InStr(strLine, " REQUEST :") > 0) then
                            resultStr = resultStr & "<br>"
                        end if

                        resultStr = resultStr & strTime & strJava & replace(strLine, vbTab , " " ) & "<br>"
                    End If
                End If

                If exceptionFlag = "Y" Then
                    if (InStr(strLine, "lina.") > 0) AND (InStr(strLine, ".catalina.") = 0) AND (InStr(strLine, ".java:") > 0) then
                        linkTxt = "<a href='#' onClick=""vbScript:openGitSource('" & strLine & "')"">" & strLine & "</a>"
                        strLine =  "<font color=red>" & linkTxt & "</font>"
                    end if

                    if (InStr(strLine, "lina.") > 0) AND (InStr(strLine, ".exception.") > 0) then
                        strLine =  "<font color=red><b>" & strLine & "</b></font>"
                    end if

                    resultStr = resultStr & "                       " & replace(strLine, vbTab , " " ) & "<br>"
                end if          
                
                '익셉션 첫번째는 본체에서 찍었으므로 패스 시킨다.
                if exceptionFlag = "YF" then
                    resultStr = resultStr & "<pre>"
                    exceptionFlag = "Y"
                end if
            Loop

            'resultTA.Value = resultStr
            resutlDiv.innerHTML = resultStr
            objFile1.Close

        ELSE   '------------------------------------------------------------------------------------------------------------------------------------------------
            
            '파일이 좀만 커도 옴팡지게 느리다.... 근데 UTF-8 인코딩이 되서 어쩔 수 없이 써야 한다.
            Set objStream = CreateObject("ADODB.Stream")
            With objStream
                .Charset = "utf-8"
                .Type = 2
                .Open
                .LoadFromFile inpFilename.value
                .LineSeparator = 10
            End with

            Do Until objStream.EOS                
                strLine = objStream.ReadText(-2)
                strLine = replace(strLine, "&", "&amp;")
                strLine = replace(strLine, "<", "&lt;")
                strLine = replace(strLine, ">", "&gt;")                
                
                skipFlag = "N"

                lineCnt = lineCnt + 1

                If InStr(strLine, targetID) > 0 OR Len(inpUUID.value) = 0 then
                    
                    '익셉션 마지막 라인
                    if exceptionFlag = "Y" then
                        resultStr = resultStr & "</pre>"
                        exceptionFlag = "N"
                    end if

                    'exception 발생하면 쭉 찍어 줘야 한다. (그 밑으로 UUID 없이 로그가 찍힌다.)
                    if InStr(strLine, "][E][") > 0 then 
                        exceptionFlag = "YF"  '익셉션 첫번째는 본체에서 찍었으므로 패스 시키기 위한 용도
                    end if

                    For Each skipStr in arrSkip
                        If InStr(strLine, skipStr) > 0 Then                    
                            skipFlag = "Y"
                        End If
                    Next

                    If skipFlag = "N" OR chkIgnore.checked = "False" then
                        strJava = ""
                        IF showJavaFileName = "Y" THEN
                            strJava = Replace(Mid(strLine, 29, 22), " ","")
                        END IF
                        strTime = Mid(strLine, 1, 25)
                        startPos = InStr(strLine, startDeli) + 1

                        IF Len(inpUUID.value) > 0 THEN
                            strLine = Mid(strLine, startPos, Len(strLine))
                        END IF

                        if (InStr(strLine, " REQUEST : ") > 0) then                            
                            resultStr = resultStr & "<hr>"
                            strLine = convertPequest(strLine)
                        end if

                        if (InStr(strLine, " Parameters:") > 0) then
                            paramCut = Mid(strLine, InStr(sqlText, "Parameters:") + 20)
                            paramCut = replace(paramCut, "(String)", "")
                            paramCut = replace(paramCut, "(Integer)", "")
                            paramCut = replace(paramCut, "(Long)", "")                    
                            paramCut = replace(paramCut, "(LocalDateTime)", "")
                            paramCut = replace(paramCut, " ", "")

                            arrParam = Split(paramCut, ",") '파라메터 데이터에 , 가 있으면 그지같이 분할되는 문제가 있지만... 귀찮다. 그렇게 까지 해야 하나?
                            cnt = 0

                            '파라메터가 1개인데 그게 공백인 경우가 있더라... 우회처리
                            if UBound(arrParam) = -1 then
                                arrParam = Split(paramCut + ",", ",")
                            end if

                            Do While (InStr(sqlText, targetChar) > 0)
                                '파라메터 맵핑
                                savePos = InStr(sqlText, targetChar) + 1
                                If arrParam(cnt) = "null" Then
                                    rpStr = replace(Mid(sqlText, 1, InStr(sqlText, targetChar)), targetChar, arrParam(cnt))
                                Else 
                                    rpStr = replace(Mid(sqlText, 1, InStr(sqlText, targetChar)), targetChar, "'" & arrParam(cnt) & "'")
                                End If
                                sqlText = rpStr & Mid(sqlText, savePos)
                                cnt = cnt + 1
                            Loop

                            '이전 SQL 줄을 먼저 찍어 준다.
                            resultStr = resultStr & strTime & strJava & replace(sqlText, vbTab , " " )

                            sqlKeep = "N"
                            sqlText = ""
                        end if

                        if (InStr(strLine, "  Preparing:") > 0) then
                            sqlKeep = "Y"
                            sqlText = convertSql(strLine)
                        end if

                        'SQL 파라메터 맵핑 외에는 바로 찍어 준다.
                        if sqlKeep = "N" then
                            resultStr = resultStr & strTime & strJava & replace(strLine, vbTab , " " ) & "<br>"
                        end if
                    End If
                End If

                If exceptionFlag = "Y" Then
                    if (InStr(strLine, "lina.") > 0) AND (InStr(strLine, ".catalina.") = 0) AND (InStr(strLine, ".java:") > 0) then
                        linkTxt = "<a href='#' onClick=""vbScript:openGitSource('" & strLine & "')"">" & strLine & "</a>"
                        strLine =  "<font color=red>" & linkTxt & "</font>"
                    end if

                    '익셉션 헤더는 굵게 해주자.
                    if (InStr(strLine, "lina.") > 0) AND (InStr(strLine, ".exception.") > 0) then
                        strLine =  "<font color=red><b>" & strLine & "</b></font>"
                    end if

                    resultStr = resultStr & "                       " & replace(strLine, vbTab , " " ) & "<br>"
                end if          
                
                '익셉션 첫번째는 본체에서 찍었으므로 패스 시킨다.
                if exceptionFlag = "YF" then
                    resultStr = resultStr & "<pre>"
                    exceptionFlag = "Y"
                end if
            Loop

            'resultTA.Value = resultStr
            resutlDiv.innerHTML = resultStr
            objStream.close
        END IF    
    End Sub

    Function convertPequest(paramText)
        resTxt = replace(paramText, ", ", "<br>" & "             , ")
        convertPequest = "<pre>" & resTxt & "</pre>"
    End Function

    '얼렁뚱땅 SQL 포맷팅
    Function convertSql(sqlText)
        sqlText = replace(sqlText, " SELECT ", "<br>" & "<br>" & "<font color=blue> SELECT </font>")
        sqlText = replace(sqlText, " select ", "<br>" & "<br>" & "<font color=blue> SELECT </font>")
        sqlText = replace(sqlText, " DELETE ", "<br>" & "<br>" & "<font color=red> DELETE </font>")
        sqlText = replace(sqlText, " delete ", "<br>" & "<br>" & "<font color=red> DELETE </font>")        
        sqlText = replace(sqlText, " FROM ", "<br>" & "<font color=blue>  FROM </font>")
        sqlText = replace(sqlText, " from ", "<br>" & "<font color=blue>  FROM </font>")
        sqlText = replace(sqlText, " WHERE ", "<br>" & "<font color=blue> WHERE </font>")
        sqlText = replace(sqlText, " where ", "<br>" & "<font color=blue> WHERE </font>")
        sqlText = replace(sqlText, " INSERT ", "<br>" & "<br>" & "<font color=purple> INSERT </font>")
        sqlText = replace(sqlText, " insert ", "<br>" & "<br>" & "<font color=purple> INSERT </font>")
        sqlText = replace(sqlText, " VALUES", "<br>" & "<font color=purple> VALUES </font>")
        sqlText = replace(sqlText, " values", "<br>" & "<font color=purple> VALUES </font>")
        sqlText = replace(sqlText, " UPDATE ", "<br>" & "<br>" & "<font color=purple> UPDATE </font>")
        sqlText = replace(sqlText, " update ", "<br>" & "<br>" & "<font color=purple> UPDATE </font>")
        sqlText = replace(sqlText, " SET ", "<br>" & "<font color=purple>    SET </font>")
        sqlText = replace(sqlText, " set ", "<br>" & "<font color=purple>    SET </font>")
        sqlText = replace(sqlText, " ORDER BY ", "<br>" & "<font color=blue> ORDER BY </font>")
        sqlText = replace(sqlText, " order by ", "<br>" & "<font color=blue> ORDER BY </font>")
        sqlText = replace(sqlText, " GROUP BY ", "<br>" & "<font color=blue> GROUP BY </font>")
        sqlText = replace(sqlText, " group by ", "<br>" & "<font color=blue> GROUP BY </font>")
        sqlText = replace(sqlText, " LEFT OUTER JOIN ", "<br>" & "<font color=blue>       LEFT OUTER JOIN </font>")
        sqlText = replace(sqlText, " left outer join ", "<br>" & "<font color=blue>       LEFT OUTER JOIN </font>")
        sqlText = replace(sqlText, " INNER JOIN ", "<br>" & "<font color=blue> INNER JOIN </font>")
        sqlText = replace(sqlText, " inner join ", "<br>" & "<font color=blue> INNER JOIN </font>")
        sqlText = replace(sqlText, " ON ", "<br>" & "<font color=blue>         ON </font>")
        sqlText = replace(sqlText, " on ", "<br>" & "<font color=blue>         ON </font>")
        sqlText = replace(sqlText, " FETCH ", "<br>" & " FETCH </font>")
        sqlText = replace(sqlText, " fetch ", "<br>" & " FETCH </font>")
        sqlText = replace(sqlText, " AND ", "<br>" & "<font color=blue>   AND </font>")
        sqlText = replace(sqlText, " and ", "<br>" & "<font color=blue>   AND </font>")
        sqlText = replace(sqlText, " WHEN ", "<br>" & "            WHEN </font>")
        sqlText = replace(sqlText, " when ", "<br>" & "            WHEN </font>")

        sqlText = replace(sqlText, ",", "," & "<br>" & "       ")

        convertSql = "<pre>" & sqlText & "</pre>"
    End Function

    Sub openGitSource(targetStr)        
        arrURI = Split(targetStr, ".")
        strPath0 = arrURI(2)
        strPath1 = arrURI(3)
        'strPath2 = arrURI(4)
        'strPath3 = arrURI(5)
        'strPath4 = arrURI(6)
        arrJAVA = Split(targetStr, "(")
        javaPart = Replace(arrJAVA(1), ")", "")
        arrFile = Split(javaPart, ":")

        midCnt = 3
        Do Until midCnt > UBound(arrURI) - 3
            midURI = midURI & "/" & arrURI(midCnt)
            midCnt = midCnt + 1
        Loop

        callPath = "https://GIT URL을 넣으세요/" & midURI & "/" & arrFile(0) & "#L" & arrFile(1)        
        
        Set objShell = CreateObject("Wscript.Shell")
        objShell.Run "chrome.exe " & callPath
    End Sub

    Sub onClickAuto
    IF chkAuto.checked = "True" THEN
        inpFilename.disabled = "disabled"
        inpPreFixDrive.disabled = "false"
        inpPreFixPath.disabled = "false"
        inpPreFixName.disabled = "false"
    ELSE
        inpFilename.disabled = "false"
        inpPreFixDrive.disabled = "disabled"
        inpPreFixPath.disabled = "disabled"
        inpPreFixName.disabled = "disabled"        
    END IF      
    End Sub
 
  </script>
 
 </head>
 
    <body>
        뻑이나요ㅠㅠ:<input id="chkBBUCK" type="checkbox" style="width:20px" title="파일 내용에 null 이 포함되어 있는 경우 체크하면 한글이 깨지고 SQL 파라메터 매핑을 포기 합니다... 로그에서 null이 없으면 좋으련만.."/> |
        자동선택:<input id="chkAuto" type="checkbox" onClick="onClickAuto" style="width:20px" title="PREFIX에 해당하는 최종 파일을 읽어 들인다" checked/> >>
        로그파일 PREFIX : <input name="inpPreFixDrive" style="width:20px" value="C:">
        <input name="inpPreFixPath" style="width:250px" value="\Users\Downloads\">
        <select name="inpPreFixName" >
            <option value="domain1">domain1</option>            
            <option value="domain2">domain2</option>
        </select>
        로그파일 직접입력: <input name="inpFilename" disabled style="width:30%" value="C:\Users\Downloads\domain1.txt">
        <input id="chkShowJavaFileName" type="checkbox" style="width:20px" title="로그에서 처리 파일명도 보고 싶어요"/><br>
        UUID : <input name="inpUUID" rows="1" style="width:20%" />        
        제낄문구(/로 구분) ON : <input id="chkIgnore" type="checkbox" style="width:20px" title="IGNORE ON/OFF" checked/>
        <input name="inpSkip" rows="1" style="width:60%" value="AAAAAAA/BBBBBBBB"/>
        <center>
        <button onclick="Run" style="width:80%;background-color:teal">멍멍</button>
        </center>
        <div id="resutlDiv" style="width:100%;height:92%;float:left;margin-top:8px;margin-right:8px;padding-top:5px;padding-left:5px;overflow:auto;line-height:1.4;background-color:fff6ec"></div>         
        </p>
    </body>
 
</html>
반응형

댓글