Skip to content

Commit 988d929

Browse files
committed
1.加入 JavaLocatable.ini 文件(是我认为的 Java 代码中的最佳日志 Pattern ) <== Console: Locate in Idea + File: locate in LogViewer
2.Tools => Statistics 时可以输入统计时的最大长度,方便统计只想要前缀相同时的场景; 3.右键菜单证件按文件过滤; 4.支持 json 和 ndjson 格式; 5.更改 fullLog 支持方式, 由编译时到运行时(ENABLE_FULL_LOG=1) 6.更改部分 Bug: a.CLogFilterView 显示位置不正确 b.源码路径选择父目录或多个目录时的问题;
1 parent 218b141 commit 988d929

20 files changed

+482
-83
lines changed

LogViewer/DialogSourceHistory.cpp

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,12 +116,26 @@ void CDialogSourceHistory::OnBnClickedBtnAddSrcPath()
116116
FTL::CFDirBrowser dirBrowser(TEXT("Choose Project Source Root Path"), m_hWnd, strSelectPath);
117117
if (dirBrowser.DoModal())
118118
{
119+
BOOL needAdd = FALSE;
119120
CString strFolderPath = dirBrowser.GetSelectPath();
120121

121122
int matchIndex = m_listSourcePaths.FindString(0, strFolderPath);
122123
if (-1 == matchIndex)
123124
{
124-
//没有才插入
125+
//没有就插入
126+
needAdd = TRUE;
127+
} else {
128+
// 有可能找到部分路径(比如:已有子目录, 尝试加入父目录), 因此这里比较完整路径
129+
CString strFoundFolderPath;
130+
m_listSourcePaths.GetText(matchIndex, strFoundFolderPath);
131+
if (0 != strFoundFolderPath.CompareNoCase(strFolderPath)) {
132+
//不一样,也需要加入
133+
needAdd = TRUE;
134+
}
135+
}
136+
137+
if (needAdd)
138+
{
125139
int nIndex = m_listSourcePaths.AddString(strFolderPath);
126140
m_listSourcePaths.SetCheck(nIndex, 1);
127141
}

LogViewer/DialogTextLength.cpp

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
// DialogTextLength.cpp : implementation file
2+
//
3+
4+
#include "stdafx.h"
5+
#include "LogViewer.h"
6+
#include "DialogTextLength.h"
7+
#include "afxdialogex.h"
8+
9+
10+
// CDialogTextLength dialog
11+
12+
IMPLEMENT_DYNAMIC(CDialogTextLength, CDialog)
13+
14+
CDialogTextLength::CDialogTextLength(INT nInitTextLength, CWnd* pParent /*=NULL*/)
15+
: CDialog(IDD_DIALOG_LENGTH, pParent)
16+
, m_nInitTextLength(nInitTextLength)
17+
{
18+
}
19+
20+
CDialogTextLength::~CDialogTextLength()
21+
{
22+
}
23+
24+
void CDialogTextLength::DoDataExchange(CDataExchange* pDX)
25+
{
26+
CDialog::DoDataExchange(pDX);
27+
DDX_Text(pDX, IDC_EDIT_TEXT_LENGTH, m_nInitTextLength);
28+
DDX_Control(pDX, IDC_EDIT_TEXT_LENGTH, m_editTextLength);
29+
}
30+
31+
32+
BEGIN_MESSAGE_MAP(CDialogTextLength, CDialog)
33+
END_MESSAGE_MAP()
34+
35+
36+
// CDialogTextLength message handlers
37+
38+
BOOL CDialogTextLength::OnInitDialog()
39+
{
40+
UpdateData(FALSE);
41+
42+
m_editTextLength.SetFocus();
43+
m_editTextLength.SetSel(0, -1);
44+
45+
return FALSE; // return TRUE unless you set the focus to a control
46+
}
47+
48+
void CDialogTextLength::OnOK()
49+
{
50+
if (UpdateData(TRUE))
51+
{
52+
__super::OnOK();
53+
}
54+
}

LogViewer/DialogTextLength.h

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
#pragma once
2+
3+
4+
// CCDialogTextLength dialog
5+
6+
class CDialogTextLength : public CDialog
7+
{
8+
DECLARE_DYNAMIC(CDialogTextLength)
9+
10+
public:
11+
CDialogTextLength(INT nInitTextLength, CWnd* pParent = NULL); // standard constructor
12+
virtual ~CDialogTextLength();
13+
14+
INT GetTextLength() const {
15+
return m_nInitTextLength;
16+
}
17+
18+
// Dialog Data
19+
20+
#ifdef AFX_DESIGN_TIME
21+
enum { IDD = IDD_DIALOG_LENGTH };
22+
#endif
23+
24+
protected:
25+
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
26+
virtual void OnOK();
27+
virtual BOOL OnInitDialog();
28+
INT m_nInitTextLength;
29+
CEdit m_editTextLength;
30+
DECLARE_MESSAGE_MAP()
31+
};

LogViewer/LogFilterView.cpp

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,11 @@ void CLogFilterView::Dump(CDumpContext& dc) const
6565

6666
void CLogFilterView::OnInitialUpdate()
6767
{
68-
FTLTRACE(TEXT("Enter OnInitialUpdate"));
68+
CRect rcClient;
69+
GetClientRect(&rcClient);
70+
71+
FTLTRACE(TEXT("Enter OnInitialUpdate, x=%d, y=%d, width=%d, height=%d"),
72+
rcClient.left, rcClient.top, rcClient.Width(), rcClient.Height());
6973

7074
if (FALSE == m_bInited)
7175
{
@@ -76,6 +80,30 @@ void CLogFilterView::OnInitialUpdate()
7680
CheckDlgButton(nId, BST_CHECKED);
7781
}
7882
m_comboBoxFilter.SetCurSel(ftAll);
83+
84+
CWnd* pEditFullTraceInfo = GetDlgItem(IDC_EDIT_FULL_TRACEINFO);
85+
86+
CRect rcFullTraceWin;
87+
pEditFullTraceInfo->GetWindowRect(&rcFullTraceWin);
88+
this->ScreenToClient(rcFullTraceWin);
89+
90+
int Margin = rcFullTraceWin.left;
91+
92+
rcFullTraceWin.right = rcClient.Width() - Margin * 2;
93+
rcFullTraceWin.bottom = rcClient.Height() - Margin;
94+
FTLTRACE(TEXT("move edit full trace to {%d, %d}, {%d x %d}"),
95+
rcFullTraceWin.left, rcFullTraceWin.top, rcFullTraceWin.Width(), rcFullTraceWin.Height());
96+
pEditFullTraceInfo->MoveWindow(rcFullTraceWin, TRUE);
97+
98+
CRect rcFilterStringWin;
99+
CWnd* pEditFilterString = GetDlgItem(IDC_EDIT_FILTER_STRING);
100+
pEditFilterString->GetWindowRect(rcFilterStringWin);
101+
this->ScreenToClient(rcFilterStringWin);
102+
rcFilterStringWin.right = rcFullTraceWin.right;
103+
pEditFilterString->MoveWindow(rcFilterStringWin, TRUE);
104+
FTLTRACE(TEXT("move edit filter to {%d, %d}, {%d x %d}"),
105+
rcFilterStringWin.left, rcFilterStringWin.top, rcFilterStringWin.Width(), rcFilterStringWin.Height());
106+
79107
this->InitAutoSizeInfo();
80108
m_bInited = TRUE;
81109
}
@@ -84,7 +112,12 @@ void CLogFilterView::OnInitialUpdate()
84112
void CLogFilterView::OnSize(UINT nType, int cx, int cy)
85113
{
86114
CFormView::OnSize(nType, cx, cy);
87-
this->AutoResizeUpdateLayout(cx,cy);
115+
FTLTRACE(TEXT("CLogFilterView::OnSize, nTYpe=%d, cx=%d, cy=%d"), nType, cx, cy)
116+
if (cx > 0 && cy > 0)
117+
{
118+
this->AutoResizeUpdateLayout(cx, cy);
119+
}
120+
88121
//if (::IsWindow(m_AllLogItemsList.GetSafeHwnd()))
89122
//{
90123
// if (-1 == m_LogItemListWidthMargin)

LogViewer/LogItemView.cpp

Lines changed: 73 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,9 @@ BEGIN_MESSAGE_MAP(CLogItemView, CListView)
7979
ON_COMMAND(ID_DETAILS_DELETE_SELECT_ITEMS, &CLogItemView::OnDetailDeleteSelectItems)
8080
ON_COMMAND(ID_DETAILS_SELECT_CURRENT_PID, &CLogItemView::OnDetailSelectCurrentPid)
8181
ON_COMMAND(ID_DETAILS_SELECT_CURRENT_TID, &CLogItemView::OnDetailSelectCurrentTid)
82+
ON_COMMAND(ID_DETAILS_SELECT_CURRENT_FILE, &CLogItemView::OnDetailSelectCurrentFile)
83+
ON_COMMAND(ID_DETAILS_CLEAR_FILTER_BY_FILES, &CLogItemView::OnDetailClearFilterByFiles)
84+
8285
ON_WM_CONTEXTMENU()
8386
ON_WM_ERASEBKGND()
8487
ON_NOTIFY_REFLECT(LVN_ITEMCHANGED, &CLogItemView::OnLvnItemchanged)
@@ -468,25 +471,7 @@ void CLogItemView::OnNMDblclk(NMHDR *pNMHDR, LRESULT *pResult)
468471
else
469472
{
470473
CString strTraceInfo(pLogItem->pszTraceInfo);
471-
472-
int leftBraPos = strTraceInfo.Find(TEXT('(')); //左括号
473-
int rightBraPos = strTraceInfo.Find(TEXT(')'));//右括号
474-
if (rightBraPos != -1)
475-
{
476-
int semPos = strTraceInfo.Find(TEXT(':'),rightBraPos);
477-
if (-1 != semPos) //找到分号,可能带有文件名和路径
478-
{
479-
strTraceInfo.SetAt(semPos,TEXT('\0'));
480-
if (-1 != leftBraPos && -1 != rightBraPos && rightBraPos > leftBraPos)
481-
{
482-
CString strLine = strTraceInfo.Mid(leftBraPos + 1, rightBraPos - leftBraPos - 1);
483-
line = _ttoi(strLine);
484-
485-
strFileName = strTraceInfo.Left(leftBraPos);
486-
rLogManager.TryReparseRealFileName(strFileName);
487-
}
488-
}
489-
}
474+
rLogManager.ParseFileNameAndPos(strTraceInfo, strFileName, line);
490475
}
491476

492477
//如果找到文件名和行号,可以尝试通过源码定位
@@ -533,7 +518,7 @@ void CLogItemView::OnNMDblclk(NMHDR *pNMHDR, LRESULT *pResult)
533518
}
534519
if (szPathFull[0] == TEXT('\0'))
535520
{
536-
StringCchCopy(szPathFull, _countof(szPathFull), spFilePathList->front());
521+
StringCchCopy(szPathFull, _countof(szPathFull), *spFilePathList->begin());
537522
}
538523
//TODO: if there are more than one file with same name, then prompt user choose
539524
}
@@ -573,11 +558,14 @@ void CLogItemView::OnContextMenu(CWnd* pWnd, CPoint point)
573558
CMenu* pDetailMenu = menuDetails.GetSubMenu(0);
574559
FTLASSERT(pDetailMenu);
575560
m_ptContextMenuClick = point;
576-
#if ENABLE_COPY_FULL_LOG
577-
pDetailMenu->EnableMenuItem(ID_DETAILS_COPY_FULL_LOG, MF_ENABLED | MF_BYCOMMAND);
578-
#else
579-
pDetailMenu->EnableMenuItem(ID_DETAILS_COPY_FULL_LOG, MF_DISABLED | MF_GRAYED | MF_BYCOMMAND);
580-
#endif
561+
562+
CLogManager& logManager = GetDocument()->m_FTLogManager;
563+
if (logManager.m_logConfig.m_nEnableFullLog)
564+
{
565+
pDetailMenu->EnableMenuItem(ID_DETAILS_COPY_FULL_LOG, MF_ENABLED | MF_BYCOMMAND);
566+
} else {
567+
pDetailMenu->EnableMenuItem(ID_DETAILS_COPY_FULL_LOG, MF_DISABLED | MF_GRAYED | MF_BYCOMMAND);
568+
}
581569
API_VERIFY(pDetailMenu->TrackPopupMenu(TPM_TOPALIGN|TPM_LEFTBUTTON,point.x,point.y,pWnd));
582570
}
583571
}
@@ -726,7 +714,6 @@ void CLogItemView::OnDetailsCopyLineText()
726714

727715
void CLogItemView::OnDetailsCopyFullLog()
728716
{
729-
#if ENABLE_COPY_FULL_LOG
730717
BOOL bRet = FALSE;
731718
CString strText;
732719

@@ -746,7 +733,6 @@ void CLogItemView::OnDetailsCopyFullLog()
746733
TEXT("pos=[%d,%d], text=%s, Last Error=%d"),
747734
lvHistTestInfo.iItem, lvHistTestInfo.iSubItem, strText, GetLastError());
748735
}
749-
#endif
750736
}
751737

752738
void CLogItemView::OnDetailDeleteSelectItems() {
@@ -820,6 +806,24 @@ void CLogItemView::_HighlightSameThread(LogItemPointer pCompareLogItem)
820806
}
821807

822808
int CLogItemView::_GetSelectedIdTypeValue(MachinePIdTIdTypeList& idTypeList) {
809+
LogItemsContainer selectedLogItems;
810+
INT nSelectedSubItem = _GetSelectedIdLogItems(selectedLogItems);
811+
812+
for (LogItemsContainerIter iter = selectedLogItems.begin(); iter != selectedLogItems.end(); ++iter)
813+
{
814+
const LogItemPointer pLogItem = *iter;
815+
MachinePIdTIdType idType;
816+
idType.machine = pLogItem->machine;
817+
idType.pid = pLogItem->processId;
818+
idType.tid = pLogItem->threadId;
819+
idTypeList.push_back(idType);
820+
FTLTRACE(TEXT("Filter machine=%s, pid=%s, tid=%s"),
821+
idType.machine.c_str(), idType.pid.c_str(), idType.tid.c_str());
822+
}
823+
return nSelectedSubItem;
824+
}
825+
826+
int CLogItemView::_GetSelectedIdLogItems(LogItemsContainer& selectedLogItems){
823827
CLogManager& logManager = GetDocument()->m_FTLogManager;
824828

825829
LogIndexContainer selectedItemList;
@@ -830,14 +834,8 @@ int CLogItemView::_GetSelectedIdTypeValue(MachinePIdTIdTypeList& idTypeList) {
830834
for (LogIndexContainerIter iter = selectedItemList.begin(); iter != selectedItemList.end(); ++iter)
831835
{
832836
const LogItemPointer pLogItem = logManager.GetDisplayLogItem(*iter);
833-
if(pLogItem){
834-
MachinePIdTIdType idType;
835-
idType.machine = pLogItem->machine;
836-
idType.pid = pLogItem->processId;
837-
idType.tid = pLogItem->threadId;
838-
idTypeList.push_back(idType);
839-
FTLTRACE(TEXT("Filter machine=%s, pid=%s, tid=%s"),
840-
idType.machine.c_str(), idType.pid.c_str(), idType.tid.c_str());
837+
if (pLogItem) {
838+
selectedLogItems.push_back(pLogItem);
841839
}
842840
}
843841
}
@@ -874,6 +872,46 @@ void CLogItemView::OnDetailSelectCurrentTid() {
874872
}
875873
}
876874

875+
void CLogItemView::OnDetailSelectCurrentFile() {
876+
int oldSelectIndex = 0;
877+
LogItemsContainer selectedLogItems;
878+
if (-1 != (oldSelectIndex = _GetSelectedIdLogItems(selectedLogItems))){
879+
CLogManager& logManager = GetDocument()->m_FTLogManager;
880+
881+
// 获取所有用户选择的有效文件名
882+
std::set<CString> selectFileNames;
883+
for(LogItemsContainerIter iter = selectedLogItems.begin(); iter != selectedLogItems.end(); ++iter){
884+
const LogItemPointer pLogItem = *iter;
885+
if (pLogItem->pszSrcFileName)
886+
{
887+
CString strFileName(pLogItem->pszSrcFileName);
888+
if (!strFileName.IsEmpty())
889+
{
890+
selectFileNames.insert(pLogItem->pszSrcFileName);
891+
}
892+
}
893+
}
894+
if (!selectFileNames.empty())
895+
{
896+
UINT nCurSelectLine = _GetCurrentFirstSelectLine();
897+
logManager.SetFilterFileNames(selectFileNames);
898+
899+
OnUpdate(this, VIEW_UPDATE_HINT_FILTER_BY_FILENAME, NULL);
900+
_GotoSpecialLine(nCurSelectLine);
901+
}
902+
}
903+
}
904+
905+
void CLogItemView::OnDetailClearFilterByFiles() {
906+
UINT nCurSelectLine = _GetCurrentFirstSelectLine();
907+
CLogManager& logManager = GetDocument()->m_FTLogManager;
908+
909+
if(logManager.ClearFilterFileNames()){
910+
OnUpdate(this, VIEW_UPDATE_HINT_FILTER_BY_FILENAME, NULL);
911+
_GotoSpecialLine(nCurSelectLine);
912+
}
913+
}
914+
877915

878916
BOOL CLogItemView::OnEraseBkgnd(CDC* pDC)
879917
{

LogViewer/LogItemView.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,8 @@ class CLogItemView : public CListView
6464
afx_msg void OnDetailDeleteSelectItems();
6565
afx_msg void OnDetailSelectCurrentPid();
6666
afx_msg void OnDetailSelectCurrentTid();
67+
afx_msg void OnDetailSelectCurrentFile();
68+
afx_msg void OnDetailClearFilterByFiles();
6769
afx_msg BOOL OnEraseBkgnd(CDC* pDC);
6870
afx_msg BOOL OnEditGoTo(UINT nID);
6971
afx_msg BOOL OnEditClearCache(UINT nID);
@@ -73,6 +75,7 @@ class CLogItemView : public CListView
7375
afx_msg void OnUpdateIndicatorSelectedLogItem(CCmdUI *pCmdUI);
7476
private:
7577
int _GetSelectedIdTypeValue(MachinePIdTIdTypeList& idTypeList);
78+
int _GetSelectedIdLogItems(LogItemsContainer& selectedLogItem);
7679
UINT _GetCurrentFirstSelectLine();
7780
BOOL _GotoSpecialLine(UINT nGotoLineNumber);
7881
};

0 commit comments

Comments
 (0)