@@ -6,11 +6,13 @@ export class LogViewerProvider implements vscode.TreeDataProvider<LogFile>, vsco
6
6
private _onDidChangeTreeData : vscode . EventEmitter < LogFile | undefined | void > = new vscode . EventEmitter < LogFile | undefined | void > ( ) ;
7
7
readonly onDidChangeTreeData : vscode . Event < LogFile | undefined | void > = this . _onDidChangeTreeData . event ;
8
8
private statusBarItem : vscode . StatusBarItem ;
9
+ private groupByMessage : boolean ;
9
10
10
11
constructor ( private workspaceRoot : string ) {
11
12
this . statusBarItem = vscode . window . createStatusBarItem ( vscode . StatusBarAlignment . Left , 100 ) ;
12
13
this . statusBarItem . command = 'magento-log-viewer.refreshLogFiles' ;
13
14
this . statusBarItem . show ( ) ;
15
+ this . groupByMessage = vscode . workspace . getConfiguration ( 'magentoLogViewer' ) . get < boolean > ( 'groupByMessage' , true ) ;
14
16
this . updateBadge ( ) ;
15
17
}
16
18
@@ -91,40 +93,69 @@ export class LogViewerProvider implements vscode.TreeDataProvider<LogFile>, vsco
91
93
}
92
94
93
95
private groupLogEntries ( lines : string [ ] , filePath : string ) : LogFile [ ] {
94
- const grouped = new Map < string , { line : string , lineNumber : number } [ ] > ( ) ;
96
+ const groupedByType = new Map < string , { message : string , line : string , lineNumber : number } [ ] > ( ) ;
95
97
96
98
lines . forEach ( ( line , index ) => {
97
99
const match = line . match ( / \. ( \w + ) : / ) ;
98
100
if ( match ) {
99
- const level = match [ 1 ] . toUpperCase ( ) ; // Changed to uppercase
101
+ const level = match [ 1 ] . toUpperCase ( ) ;
100
102
const message = line . replace ( / ^ \[ .* ?\] \s * \. \w + : \s * / , '' ) ;
101
- const entries = grouped . get ( level ) || [ ] ;
102
- entries . push ( { line : message , lineNumber : index } ) ;
103
- grouped . set ( level , entries ) ;
103
+ const entries = groupedByType . get ( level ) || [ ] ;
104
+ entries . push ( { message, line , lineNumber : index } ) ;
105
+ groupedByType . set ( level , entries ) ;
104
106
}
105
107
} ) ;
106
108
107
- return Array . from ( grouped . entries ( ) ) . map ( ( [ level , entries ] ) => {
108
- const count = entries . length ;
109
- const label = `${ level } (${ count } )` ;
110
- const logFile = new LogFile ( label , vscode . TreeItemCollapsibleState . Collapsed , undefined ,
111
- entries . map ( entry => {
112
- const lineNumber = ( entry . lineNumber + 1 ) . toString ( ) . padStart ( 2 , '0' ) ;
113
- return new LogFile (
114
- `Line ${ lineNumber } : ${ entry . line } ` ,
115
- vscode . TreeItemCollapsibleState . None ,
116
- {
117
- command : 'magento-log-viewer.openFileAtLine' ,
118
- title : 'Open Log File at Line' ,
119
- arguments : [ filePath , entry . lineNumber ]
120
- }
109
+ return Array . from ( groupedByType . entries ( ) ) . map ( ( [ level , entries ] ) => {
110
+ if ( this . groupByMessage ) {
111
+ const groupedByMessage = new Map < string , { line : string , lineNumber : number } [ ] > ( ) ;
112
+
113
+ entries . forEach ( entry => {
114
+ const messageGroup = groupedByMessage . get ( entry . message ) || [ ] ;
115
+ messageGroup . push ( { line : entry . line , lineNumber : entry . lineNumber } ) ;
116
+ groupedByMessage . set ( entry . message , messageGroup ) ;
117
+ } ) ;
118
+
119
+ const messageGroups = Array . from ( groupedByMessage . entries ( ) ) . map ( ( [ message , messageEntries ] ) => {
120
+ const count = messageEntries . length ;
121
+ const label = `${ message } (${ count } )` ;
122
+ return new LogFile ( label , vscode . TreeItemCollapsibleState . Collapsed , undefined ,
123
+ messageEntries . map ( entry => {
124
+ const lineNumber = ( entry . lineNumber + 1 ) . toString ( ) . padStart ( 2 , '0' ) ;
125
+ return new LogFile (
126
+ `Line ${ lineNumber } : ${ entry . line } ` ,
127
+ vscode . TreeItemCollapsibleState . None ,
128
+ {
129
+ command : 'magento-log-viewer.openFileAtLine' ,
130
+ title : 'Open Log File at Line' ,
131
+ arguments : [ filePath , entry . lineNumber ]
132
+ }
133
+ ) ;
134
+ } )
121
135
) ;
122
- } )
123
- ) ;
136
+ } ) ;
124
137
125
- // Set icon based on known log levels, use default for others
126
- logFile . iconPath = this . getIconForLogLevel ( level ) ;
127
- return logFile ;
138
+ const logFile = new LogFile ( `${ level } (${ entries . length } , grouped)` , vscode . TreeItemCollapsibleState . Collapsed , undefined , messageGroups ) ;
139
+ logFile . iconPath = this . getIconForLogLevel ( level ) ;
140
+ return logFile ;
141
+ } else {
142
+ const logFile = new LogFile ( `${ level } (${ entries . length } )` , vscode . TreeItemCollapsibleState . Collapsed , undefined ,
143
+ entries . map ( entry => {
144
+ const lineNumber = ( entry . lineNumber + 1 ) . toString ( ) . padStart ( 2 , '0' ) ;
145
+ return new LogFile (
146
+ `Line ${ lineNumber } : ${ entry . line } ` ,
147
+ vscode . TreeItemCollapsibleState . None ,
148
+ {
149
+ command : 'magento-log-viewer.openFileAtLine' ,
150
+ title : 'Open Log File at Line' ,
151
+ arguments : [ filePath , entry . lineNumber ]
152
+ }
153
+ ) ;
154
+ } )
155
+ ) ;
156
+ logFile . iconPath = this . getIconForLogLevel ( level ) ;
157
+ return logFile ;
158
+ }
128
159
} ) ;
129
160
}
130
161
0 commit comments