반응형
로그파일이... 너무 보기 힘들어서 만듬.
혹시라도 그럴 일이 없을 것 같지만, 나중에 딴대서 써 먹을 수도 있을 것 같아서 올려둠.
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, "&", "&")
strLine = replace(strLine, "<", "<")
strLine = replace(strLine, ">", ">")
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, "&", "&")
strLine = replace(strLine, "<", "<")
strLine = replace(strLine, ">", ">")
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>
반응형
댓글