logler 1.1.0__tar.gz → 1.1.3__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {logler-1.1.0 → logler-1.1.3}/Cargo.lock +25 -26
- {logler-1.1.0 → logler-1.1.3}/Cargo.toml +1 -1
- {logler-1.1.0 → logler-1.1.3}/PKG-INFO +121 -92
- {logler-1.1.0 → logler-1.1.3}/README.md +118 -90
- {logler-1.1.0 → logler-1.1.3}/crates/logler-core/src/hierarchy.rs +167 -33
- {logler-1.1.0 → logler-1.1.3}/crates/logler-core/src/investigate.rs +10 -1
- {logler-1.1.0 → logler-1.1.3}/crates/logler-core/src/parser.rs +40 -3
- {logler-1.1.0 → logler-1.1.3}/pyproject.toml +8 -2
- logler-1.1.3/src/logler/__init__.py +127 -0
- {logler-1.1.0 → logler-1.1.3}/src/logler/cli.py +19 -8
- {logler-1.1.0 → logler-1.1.3}/src/logler/investigate.py +31 -10
- {logler-1.1.0 → logler-1.1.3}/src/logler/llm_cli.py +792 -3
- logler-1.1.3/src/logler/models.py +527 -0
- {logler-1.1.0 → logler-1.1.3}/src/logler/parser.py +3 -0
- {logler-1.1.0 → logler-1.1.3}/src/logler/tree_formatter.py +46 -14
- logler-1.1.0/src/logler/__init__.py +0 -22
- {logler-1.1.0 → logler-1.1.3}/LICENSE +0 -0
- {logler-1.1.0 → logler-1.1.3}/crates/logler-core/Cargo.toml +0 -0
- {logler-1.1.0 → logler-1.1.3}/crates/logler-core/src/filter.rs +0 -0
- {logler-1.1.0 → logler-1.1.3}/crates/logler-core/src/index.rs +0 -0
- {logler-1.1.0 → logler-1.1.3}/crates/logler-core/src/lib.rs +0 -0
- {logler-1.1.0 → logler-1.1.3}/crates/logler-core/src/reader.rs +0 -0
- {logler-1.1.0 → logler-1.1.3}/crates/logler-core/src/stats.rs +0 -0
- {logler-1.1.0 → logler-1.1.3}/crates/logler-core/src/thread_tracker.rs +0 -0
- {logler-1.1.0 → logler-1.1.3}/crates/logler-core/src/trace.rs +0 -0
- {logler-1.1.0 → logler-1.1.3}/crates/logler-core/src/types.rs +0 -0
- {logler-1.1.0 → logler-1.1.3}/crates/logler-py/Cargo.toml +0 -0
- {logler-1.1.0 → logler-1.1.3}/crates/logler-py/src/lib.rs +0 -0
- {logler-1.1.0 → logler-1.1.3}/src/logler/bootstrap.py +0 -0
- {logler-1.1.0 → logler-1.1.3}/src/logler/cache.py +0 -0
- {logler-1.1.0 → logler-1.1.3}/src/logler/helpers.py +0 -0
- {logler-1.1.0 → logler-1.1.3}/src/logler/log_reader.py +0 -0
- {logler-1.1.0 → logler-1.1.3}/src/logler/safe_regex.py +0 -0
- {logler-1.1.0 → logler-1.1.3}/src/logler/sql.py +0 -0
- {logler-1.1.0 → logler-1.1.3}/src/logler/terminal.py +0 -0
- {logler-1.1.0 → logler-1.1.3}/src/logler/tracker.py +0 -0
- {logler-1.1.0 → logler-1.1.3}/src/logler/watcher.py +0 -0
|
@@ -253,9 +253,9 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5"
|
|
|
253
253
|
|
|
254
254
|
[[package]]
|
|
255
255
|
name = "cc"
|
|
256
|
-
version = "1.2.
|
|
256
|
+
version = "1.2.54"
|
|
257
257
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
258
|
-
checksum = "
|
|
258
|
+
checksum = "6354c81bbfd62d9cfa9cb3c773c2b7b2a3a482d569de977fd0e961f6e7c00583"
|
|
259
259
|
dependencies = [
|
|
260
260
|
"find-msvc-tools",
|
|
261
261
|
"shlex",
|
|
@@ -520,14 +520,13 @@ checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be"
|
|
|
520
520
|
|
|
521
521
|
[[package]]
|
|
522
522
|
name = "filetime"
|
|
523
|
-
version = "0.2.
|
|
523
|
+
version = "0.2.27"
|
|
524
524
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
525
|
-
checksum = "
|
|
525
|
+
checksum = "f98844151eee8917efc50bd9e8318cb963ae8b297431495d3f758616ea5c57db"
|
|
526
526
|
dependencies = [
|
|
527
527
|
"cfg-if",
|
|
528
528
|
"libc",
|
|
529
529
|
"libredox",
|
|
530
|
-
"windows-sys 0.60.2",
|
|
531
530
|
]
|
|
532
531
|
|
|
533
532
|
[[package]]
|
|
@@ -954,7 +953,7 @@ checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897"
|
|
|
954
953
|
|
|
955
954
|
[[package]]
|
|
956
955
|
name = "logler-cli"
|
|
957
|
-
version = "1.1.
|
|
956
|
+
version = "1.1.3"
|
|
958
957
|
dependencies = [
|
|
959
958
|
"anyhow",
|
|
960
959
|
"clap",
|
|
@@ -969,7 +968,7 @@ dependencies = [
|
|
|
969
968
|
|
|
970
969
|
[[package]]
|
|
971
970
|
name = "logler-core"
|
|
972
|
-
version = "1.1.
|
|
971
|
+
version = "1.1.3"
|
|
973
972
|
dependencies = [
|
|
974
973
|
"anyhow",
|
|
975
974
|
"async-stream",
|
|
@@ -984,7 +983,7 @@ dependencies = [
|
|
|
984
983
|
"serde",
|
|
985
984
|
"serde_json",
|
|
986
985
|
"tempfile",
|
|
987
|
-
"thiserror 2.0.
|
|
986
|
+
"thiserror 2.0.18",
|
|
988
987
|
"tokio",
|
|
989
988
|
"tokio-stream",
|
|
990
989
|
"tracing",
|
|
@@ -993,7 +992,7 @@ dependencies = [
|
|
|
993
992
|
|
|
994
993
|
[[package]]
|
|
995
994
|
name = "logler-py"
|
|
996
|
-
version = "1.1.
|
|
995
|
+
version = "1.1.3"
|
|
997
996
|
dependencies = [
|
|
998
997
|
"anyhow",
|
|
999
998
|
"logler-core",
|
|
@@ -1005,7 +1004,7 @@ dependencies = [
|
|
|
1005
1004
|
|
|
1006
1005
|
[[package]]
|
|
1007
1006
|
name = "logler-server"
|
|
1008
|
-
version = "1.1.
|
|
1007
|
+
version = "1.1.3"
|
|
1009
1008
|
dependencies = [
|
|
1010
1009
|
"anyhow",
|
|
1011
1010
|
"axum",
|
|
@@ -1016,7 +1015,7 @@ dependencies = [
|
|
|
1016
1015
|
"notify",
|
|
1017
1016
|
"serde",
|
|
1018
1017
|
"serde_json",
|
|
1019
|
-
"thiserror 2.0.
|
|
1018
|
+
"thiserror 2.0.18",
|
|
1020
1019
|
"tokio",
|
|
1021
1020
|
"tower-http",
|
|
1022
1021
|
"tracing",
|
|
@@ -1233,9 +1232,9 @@ dependencies = [
|
|
|
1233
1232
|
|
|
1234
1233
|
[[package]]
|
|
1235
1234
|
name = "proc-macro2"
|
|
1236
|
-
version = "1.0.
|
|
1235
|
+
version = "1.0.106"
|
|
1237
1236
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1238
|
-
checksum = "
|
|
1237
|
+
checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934"
|
|
1239
1238
|
dependencies = [
|
|
1240
1239
|
"unicode-ident",
|
|
1241
1240
|
]
|
|
@@ -1307,9 +1306,9 @@ dependencies = [
|
|
|
1307
1306
|
|
|
1308
1307
|
[[package]]
|
|
1309
1308
|
name = "quote"
|
|
1310
|
-
version = "1.0.
|
|
1309
|
+
version = "1.0.44"
|
|
1311
1310
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1312
|
-
checksum = "
|
|
1311
|
+
checksum = "21b2ebcf727b7760c461f091f9f0f539b77b8e87f2fd88131e7f1b433b3cece4"
|
|
1313
1312
|
dependencies = [
|
|
1314
1313
|
"proc-macro2",
|
|
1315
1314
|
]
|
|
@@ -1573,9 +1572,9 @@ checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03"
|
|
|
1573
1572
|
|
|
1574
1573
|
[[package]]
|
|
1575
1574
|
name = "socket2"
|
|
1576
|
-
version = "0.6.
|
|
1575
|
+
version = "0.6.2"
|
|
1577
1576
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1578
|
-
checksum = "
|
|
1577
|
+
checksum = "86f4aa3ad99f2088c990dfa82d367e19cb29268ed67c574d10d0a4bfe71f07e0"
|
|
1579
1578
|
dependencies = [
|
|
1580
1579
|
"libc",
|
|
1581
1580
|
"windows-sys 0.60.2",
|
|
@@ -1634,11 +1633,11 @@ dependencies = [
|
|
|
1634
1633
|
|
|
1635
1634
|
[[package]]
|
|
1636
1635
|
name = "thiserror"
|
|
1637
|
-
version = "2.0.
|
|
1636
|
+
version = "2.0.18"
|
|
1638
1637
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1639
|
-
checksum = "
|
|
1638
|
+
checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4"
|
|
1640
1639
|
dependencies = [
|
|
1641
|
-
"thiserror-impl 2.0.
|
|
1640
|
+
"thiserror-impl 2.0.18",
|
|
1642
1641
|
]
|
|
1643
1642
|
|
|
1644
1643
|
[[package]]
|
|
@@ -1654,9 +1653,9 @@ dependencies = [
|
|
|
1654
1653
|
|
|
1655
1654
|
[[package]]
|
|
1656
1655
|
name = "thiserror-impl"
|
|
1657
|
-
version = "2.0.
|
|
1656
|
+
version = "2.0.18"
|
|
1658
1657
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1659
|
-
checksum = "
|
|
1658
|
+
checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5"
|
|
1660
1659
|
dependencies = [
|
|
1661
1660
|
"proc-macro2",
|
|
1662
1661
|
"quote",
|
|
@@ -1889,9 +1888,9 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821"
|
|
|
1889
1888
|
|
|
1890
1889
|
[[package]]
|
|
1891
1890
|
name = "uuid"
|
|
1892
|
-
version = "1.
|
|
1891
|
+
version = "1.20.0"
|
|
1893
1892
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1894
|
-
checksum = "
|
|
1893
|
+
checksum = "ee48d38b119b0cd71fe4141b30f5ba9c7c5d9f4e7a3a8b4a674e4b6ef789976f"
|
|
1895
1894
|
dependencies = [
|
|
1896
1895
|
"getrandom 0.3.4",
|
|
1897
1896
|
"js-sys",
|
|
@@ -2236,6 +2235,6 @@ dependencies = [
|
|
|
2236
2235
|
|
|
2237
2236
|
[[package]]
|
|
2238
2237
|
name = "zmij"
|
|
2239
|
-
version = "1.0.
|
|
2238
|
+
version = "1.0.16"
|
|
2240
2239
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
2241
|
-
checksum = "
|
|
2240
|
+
checksum = "dfcd145825aace48cff44a8844de64bf75feec3080e0aa5cdbde72961ae51a65"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: logler
|
|
3
|
-
Version: 1.1.
|
|
3
|
+
Version: 1.1.3
|
|
4
4
|
Classifier: Development Status :: 4 - Beta
|
|
5
5
|
Classifier: Intended Audience :: Developers
|
|
6
6
|
Classifier: License :: OSI Approved :: MIT License
|
|
@@ -15,9 +15,10 @@ Requires-Dist: rich>=13.0.0
|
|
|
15
15
|
Requires-Dist: watchdog>=4.0.0
|
|
16
16
|
Requires-Dist: click>=8.1.0
|
|
17
17
|
Requires-Dist: duckdb>=1.0
|
|
18
|
+
Requires-Dist: pydantic>=2.0
|
|
18
19
|
Requires-Dist: pytest>=8.0.0 ; extra == 'dev'
|
|
19
20
|
Requires-Dist: pytest-asyncio>=0.23.0 ; extra == 'dev'
|
|
20
|
-
Requires-Dist: black>=
|
|
21
|
+
Requires-Dist: black>=25.0.0 ; extra == 'dev'
|
|
21
22
|
Requires-Dist: ruff>=0.3.0 ; extra == 'dev'
|
|
22
23
|
Requires-Dist: httpx>=0.28.0 ; extra == 'dev'
|
|
23
24
|
Requires-Dist: maturin>=1.10.0 ; extra == 'dev'
|
|
@@ -50,20 +51,18 @@ Project-URL: Repository, https://github.com/gabu-quest/logler
|
|
|
50
51
|
[](https://pypi.org/project/logler/)
|
|
51
52
|
[](https://github.com/gabu-quest/logler)
|
|
52
53
|
|
|
53
|
-
A modern, feature-rich log viewer that makes debugging a pleasure. View logs in your terminal with beautiful colors or
|
|
54
|
+
A modern, feature-rich log viewer that makes debugging a pleasure. View logs in your terminal with beautiful colors, or use [logler-web](https://github.com/gabu-quest/logler-web) for a modern web interface.
|
|
54
55
|
|
|
55
56
|
## ✨ Features
|
|
56
57
|
|
|
57
58
|
- 🎨 **Beautiful Terminal Output** - Rich colors and formatting with thread visualization
|
|
58
|
-
- 🌐 **Gorgeous Web UI** - Modern interface with file picker and live updates
|
|
59
59
|
- 🧵 **Thread Tracking** - Follow execution flow across log entries
|
|
60
60
|
- 🔗 **Correlation IDs** - Track requests across microservices
|
|
61
61
|
- 📊 **Distributed Tracing** - OpenTelemetry span/trace support
|
|
62
|
-
- ⚡ **Real-time Streaming** - WebSocket support for live log following
|
|
63
62
|
- 🔍 **Smart Filtering** - By level, thread, pattern, or correlation ID
|
|
64
63
|
- 📝 **Multi-Format Support** - JSON, plain text, syslog, and more
|
|
65
|
-
- 📂 **File Picker** - Browse and select log files from the UI
|
|
66
64
|
- 🎯 **Zero Config** - Works out of the box
|
|
65
|
+
- 🌐 **Web UI Available** - See [logler-web](https://github.com/gabu-quest/logler-web) for Vue3 + Naive-UI interface
|
|
67
66
|
|
|
68
67
|
## 🤖 NEW: LLM Investigation Engine
|
|
69
68
|
|
|
@@ -93,75 +92,116 @@ A modern, feature-rich log viewer that makes debugging a pleasure. View logs in
|
|
|
93
92
|
- 🤔 **Explain Feature** - Plain English explanations of cryptic errors with next steps
|
|
94
93
|
- 💬 **Contextual Suggestions** - AI suggests what to investigate next based on findings
|
|
95
94
|
|
|
95
|
+
### Public API Contract
|
|
96
|
+
|
|
97
|
+
Each code block carries a **Contract ID** (e.g., `[C01]`). The test suite in `tests/test_readme.py` executes these snippets against the documented public APIs. When this section changes, the tests must change with it — CI proves the README.
|
|
98
|
+
|
|
99
|
+
#### [C01] Auto-insights analysis
|
|
96
100
|
```python
|
|
97
101
|
import logler.investigate as investigate
|
|
98
102
|
|
|
99
|
-
# 🎯 One-line auto investigation with insights
|
|
100
103
|
result = investigate.analyze_with_insights(files=["app.log"])
|
|
101
104
|
print(result['insights']) # Automatic pattern detection, error analysis, suggestions
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
#### [C02] Token-efficient search
|
|
108
|
+
```python
|
|
109
|
+
import logler.investigate as investigate
|
|
102
110
|
|
|
103
|
-
# 📉 Token-efficient search (44x smaller output)
|
|
104
111
|
errors = investigate.search(files=["app.log"], level="ERROR", output_format="summary")
|
|
105
112
|
# Returns aggregated stats instead of all entries - perfect for limited context windows
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
#### [C03] Compare threads
|
|
116
|
+
```python
|
|
117
|
+
import logler.investigate as investigate
|
|
106
118
|
|
|
107
|
-
# 🔀 Compare successful vs failed requests
|
|
108
119
|
diff = investigate.compare_threads(
|
|
109
120
|
files=["app.log"],
|
|
110
121
|
correlation_a="req-success-123",
|
|
111
122
|
correlation_b="req-failed-456"
|
|
112
123
|
)
|
|
113
|
-
print(diff['summary']) #
|
|
124
|
+
print(diff['summary']) # Comparison of two request flows
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
#### [C04] Cross-service timeline
|
|
128
|
+
```python
|
|
129
|
+
import logler.investigate as investigate
|
|
114
130
|
|
|
115
|
-
# 🌐 Cross-service distributed tracing
|
|
116
131
|
timeline = investigate.cross_service_timeline(
|
|
117
132
|
files={"api": ["api.log"], "db": ["db.log"], "cache": ["cache.log"]},
|
|
118
133
|
correlation_id="req-12345"
|
|
119
134
|
)
|
|
120
135
|
# See request flow: API → DB → Cache with latency breakdown
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
#### [C05] Investigation sessions
|
|
139
|
+
```python
|
|
140
|
+
import logler.investigate as investigate
|
|
121
141
|
|
|
122
|
-
# 📝 Track investigation with sessions
|
|
123
142
|
session = investigate.InvestigationSession(files=["app.log"], name="incident_2024")
|
|
124
143
|
session.search(level="ERROR")
|
|
125
144
|
session.find_patterns()
|
|
126
145
|
session.add_note("Database connection pool exhausted")
|
|
127
146
|
report = session.generate_report(format="markdown") # Auto-generate report
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
#### [C06] Smart sampling
|
|
150
|
+
```python
|
|
151
|
+
import logler.investigate as investigate
|
|
128
152
|
|
|
129
|
-
# 🎯 Smart sampling (representative sample of huge logs)
|
|
130
153
|
sample = investigate.smart_sample(
|
|
131
154
|
files=["huge.log"],
|
|
132
155
|
strategy="errors_focused", # or "diverse", "representative", "chronological"
|
|
133
156
|
sample_size=50
|
|
134
157
|
)
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
#### [C07] Error explanation
|
|
161
|
+
```python
|
|
162
|
+
import logler.investigate as investigate
|
|
135
163
|
|
|
136
|
-
# 🤔 Explain cryptic errors in plain English
|
|
137
164
|
explanation = investigate.explain(error_message="Connection pool exhausted", context="production")
|
|
138
165
|
print(explanation) # Common causes, next steps, production-specific advice
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
#### [C08] Thread hierarchy
|
|
169
|
+
```python
|
|
170
|
+
import logler.investigate as investigate
|
|
139
171
|
|
|
140
|
-
# 🌳 Hierarchical thread visualization (NEW!)
|
|
141
172
|
hierarchy = investigate.follow_thread_hierarchy(
|
|
142
173
|
files=["app.log"],
|
|
143
174
|
root_identifier="req-123",
|
|
144
175
|
min_confidence=0.8 # Only show high-confidence relationships
|
|
145
176
|
)
|
|
146
|
-
|
|
147
177
|
# Automatic bottleneck detection
|
|
148
|
-
if hierarchy
|
|
178
|
+
if hierarchy.get('bottleneck'):
|
|
149
179
|
print(f"Bottleneck: {hierarchy['bottleneck']['node_id']} took {hierarchy['bottleneck']['duration_ms']}ms")
|
|
180
|
+
```
|
|
150
181
|
|
|
151
|
-
|
|
182
|
+
#### [C09] Hierarchy summary
|
|
183
|
+
```python
|
|
184
|
+
import logler.investigate as investigate
|
|
185
|
+
|
|
186
|
+
# Using hierarchy from [C08]
|
|
152
187
|
summary = investigate.get_hierarchy_summary(hierarchy)
|
|
153
188
|
print(summary) # Shows tree structure, errors, bottlenecks
|
|
189
|
+
```
|
|
154
190
|
|
|
155
|
-
|
|
191
|
+
#### [C10] Tree visualization
|
|
192
|
+
```python
|
|
156
193
|
from logler.tree_formatter import print_tree, print_waterfall
|
|
194
|
+
|
|
195
|
+
# Using hierarchy from [C08]
|
|
157
196
|
print_tree(hierarchy, mode="detailed", show_duration=True)
|
|
158
|
-
print_waterfall(hierarchy, width=100) # Waterfall timeline
|
|
197
|
+
print_waterfall(hierarchy, width=100) # Waterfall timeline
|
|
159
198
|
```
|
|
160
199
|
|
|
161
200
|
**📚 Complete LLM documentation:**
|
|
162
|
-
- [
|
|
201
|
+
- [LLM CLI Reference](docs/LLM_CLI_REFERENCE.md) - All 16 CLI commands for AI agents
|
|
202
|
+
- [Python API Guide](docs/LLM_README.md) - Library API and examples
|
|
203
|
+
- [API Reference](docs/LLM_INVESTIGATION_API.md) - All investigation functions
|
|
163
204
|
- [日本語ガイド](README.ja.md) - 完全なドキュメント
|
|
164
|
-
- [API Reference](docs/LLM_INVESTIGATION_API.md) - All investigation tools
|
|
165
205
|
- [Examples](examples/) - Production incident investigations
|
|
166
206
|
|
|
167
207
|
## 🚀 Quick Start
|
|
@@ -178,21 +218,6 @@ uv pip install logler
|
|
|
178
218
|
|
|
179
219
|
### Usage
|
|
180
220
|
|
|
181
|
-
**Start the web interface:**
|
|
182
|
-
```bash
|
|
183
|
-
logler serve # Start with file picker
|
|
184
|
-
logler serve app.log # Open specific file
|
|
185
|
-
logler serve *.log # Open multiple files
|
|
186
|
-
logler serve --open # Auto-open browser
|
|
187
|
-
```
|
|
188
|
-
|
|
189
|
-
### Security and path restrictions
|
|
190
|
-
|
|
191
|
-
- The legacy Python web UI now enforces a **log root** to avoid accidental exposure of arbitrary files. Set `LOGLER_ROOT` to
|
|
192
|
-
the directory you want to browse (defaults to the current working directory). Requests outside that root are rejected.
|
|
193
|
-
- For production or remote access, place the service behind authentication/reverse proxies; the built-in UI is intended for
|
|
194
|
-
local or trusted environments only.
|
|
195
|
-
|
|
196
221
|
**View logs in terminal:**
|
|
197
222
|
```bash
|
|
198
223
|
logler view app.log # View entire file
|
|
@@ -216,16 +241,48 @@ logler investigate app.log --errors # Analyze errors
|
|
|
216
241
|
logler investigate app.log --patterns # Find repeated patterns
|
|
217
242
|
logler investigate app.log --thread worker-1 # Follow specific thread
|
|
218
243
|
logler investigate app.log --correlation req-123 # Follow correlation ID
|
|
244
|
+
logler investigate app.log --trace trace-abc123 # Follow distributed trace
|
|
219
245
|
logler investigate app.log --output summary # Token-efficient output
|
|
220
246
|
|
|
221
247
|
# 🌳 NEW: Hierarchical Thread Visualization
|
|
222
248
|
logler investigate app.log --correlation req-123 --hierarchy # Show thread hierarchy tree
|
|
223
|
-
logler investigate app.log --
|
|
249
|
+
logler investigate app.log --trace trace-abc123 --hierarchy --waterfall # Show waterfall timeline
|
|
224
250
|
logler investigate app.log --correlation req-123 --hierarchy --flamegraph # Show flamegraph view
|
|
225
251
|
logler investigate app.log --hierarchy --show-error-flow # Analyze error propagation
|
|
226
252
|
logler investigate app.log --thread worker-1 --hierarchy --max-depth 3 # Limit hierarchy depth
|
|
227
253
|
```
|
|
228
254
|
|
|
255
|
+
**LLM-first CLI (JSON output by default):**
|
|
256
|
+
|
|
257
|
+
Designed for AI agents - 16 commands with structured JSON output, no truncation.
|
|
258
|
+
|
|
259
|
+
```bash
|
|
260
|
+
# Assessment & Overview
|
|
261
|
+
logler llm triage app.log --last 1h # Quick severity assessment
|
|
262
|
+
logler llm summarize app.log # Concise summary with stats
|
|
263
|
+
logler llm schema app.log # Infer log structure
|
|
264
|
+
|
|
265
|
+
# Search & Analysis
|
|
266
|
+
logler llm search app.log --level ERROR # Find entries (full results)
|
|
267
|
+
logler llm sql "SELECT level, COUNT(*) FROM logs GROUP BY level" -f app.log
|
|
268
|
+
|
|
269
|
+
# Request Tracing
|
|
270
|
+
logler llm correlate req-123 --files "*.log" # Follow correlation ID
|
|
271
|
+
logler llm hierarchy trace-xyz --files "*.log" # Build hierarchy tree
|
|
272
|
+
logler llm bottleneck trace-xyz --files "*.log" # Find slow operations
|
|
273
|
+
|
|
274
|
+
# Comparison
|
|
275
|
+
logler llm compare req-fail req-success --files "*.log" # Compare requests
|
|
276
|
+
logler llm diff app.log --baseline 1h # Before/after analysis
|
|
277
|
+
|
|
278
|
+
# Utilities
|
|
279
|
+
logler llm sample app.log --strategy errors_focused --size 50
|
|
280
|
+
logler llm context app.log 1523 --before 10 --after 10
|
|
281
|
+
logler llm export trace-xyz --format jaeger
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
See **[LLM CLI Reference](docs/LLM_CLI_REFERENCE.md)** for complete documentation of all 16 commands.
|
|
285
|
+
|
|
229
286
|
### Visualization Modes
|
|
230
287
|
|
|
231
288
|
**Tree View** - Shows parent-child relationships:
|
|
@@ -287,14 +344,6 @@ logler watch "app-*.log" -d /var/log # Specific directory
|
|
|
287
344
|
|
|
288
345
|
## 📸 Screenshots
|
|
289
346
|
|
|
290
|
-
### Web Interface
|
|
291
|
-
Beautiful, modern web UI with file picker and real-time updates:
|
|
292
|
-
- 📁 Browse and select log files
|
|
293
|
-
- 🎨 Syntax-highlighted logs
|
|
294
|
-
- 🧵 Thread visualization
|
|
295
|
-
- 📊 Live statistics
|
|
296
|
-
- 🔄 Real-time following with WebSocket
|
|
297
|
-
|
|
298
347
|
### Terminal
|
|
299
348
|
Rich, colorful terminal output:
|
|
300
349
|
- 🌈 Color-coded log levels
|
|
@@ -302,26 +351,10 @@ Rich, colorful terminal output:
|
|
|
302
351
|
- 🔗 Correlation ID tracking
|
|
303
352
|
- 📈 Thread timelines
|
|
304
353
|
|
|
305
|
-
## 🎯 Examples
|
|
306
|
-
|
|
307
354
|
### Web Interface
|
|
355
|
+
For a modern web UI, see [logler-web](https://github.com/gabu-quest/logler-web) - Vue3 + Naive-UI with real-time updates.
|
|
308
356
|
|
|
309
|
-
|
|
310
|
-
# Start server and auto-open browser
|
|
311
|
-
logler serve --open
|
|
312
|
-
|
|
313
|
-
# Start with specific files
|
|
314
|
-
logler serve /var/log/app.log /var/log/error.log
|
|
315
|
-
|
|
316
|
-
# Custom host/port
|
|
317
|
-
logler serve --host 0.0.0.0 --port 9000
|
|
318
|
-
```
|
|
319
|
-
|
|
320
|
-
Then open your browser to `http://localhost:8000` and:
|
|
321
|
-
1. Click "📁 Open File" to browse log files
|
|
322
|
-
2. Filter by level, search, or thread
|
|
323
|
-
3. Click "🔄 Follow" for real-time streaming
|
|
324
|
-
4. View thread timelines and statistics
|
|
357
|
+
## 🎯 Examples
|
|
325
358
|
|
|
326
359
|
### Terminal Viewing
|
|
327
360
|
|
|
@@ -367,6 +400,7 @@ logler investigate app.log --patterns --min-occurrences 5
|
|
|
367
400
|
# Follow a specific thread or request
|
|
368
401
|
logler investigate app.log --thread worker-1
|
|
369
402
|
logler investigate app.log --correlation req-abc123
|
|
403
|
+
logler investigate app.log --trace trace-xyz789
|
|
370
404
|
|
|
371
405
|
# Token-efficient output for LLMs
|
|
372
406
|
logler investigate app.log --auto-insights --output summary
|
|
@@ -464,41 +498,34 @@ Logler automatically tracks threads and shows:
|
|
|
464
498
|
|
|
465
499
|
**Example:**
|
|
466
500
|
```bash
|
|
467
|
-
logler view app.log
|
|
501
|
+
logler view app.log --thread worker-1
|
|
468
502
|
```
|
|
469
|
-
Shows threads in sidebar with:
|
|
470
|
-
- Thread ID badge
|
|
471
|
-
- Number of logs
|
|
472
|
-
- Error count (if any)
|
|
473
503
|
|
|
474
|
-
|
|
504
|
+
Filter logs by thread to trace execution flow.
|
|
475
505
|
|
|
476
506
|
## 🔗 Correlation & Tracing
|
|
477
507
|
|
|
478
508
|
Track requests across services:
|
|
479
509
|
|
|
480
510
|
```bash
|
|
481
|
-
#
|
|
482
|
-
logler
|
|
483
|
-
|
|
511
|
+
# Follow a specific correlation ID
|
|
512
|
+
logler investigate app.log --correlation req-12345
|
|
513
|
+
|
|
514
|
+
# Follow a distributed trace ID
|
|
515
|
+
logler investigate app.log --trace trace-xyz789
|
|
484
516
|
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
- View complete request flow
|
|
489
|
-
- Track distributed traces
|
|
517
|
+
# View across multiple service logs
|
|
518
|
+
logler view app.log service.log --grep "req-12345"
|
|
519
|
+
```
|
|
490
520
|
|
|
491
521
|
## ⚙️ Configuration
|
|
492
522
|
|
|
493
523
|
Logler works with zero configuration, but you can customize:
|
|
494
524
|
|
|
495
525
|
```bash
|
|
496
|
-
# Server options
|
|
497
|
-
logler serve --host 0.0.0.0 --port 8000
|
|
498
|
-
|
|
499
526
|
# View options
|
|
500
527
|
logler view app.log --no-color # Disable colors
|
|
501
|
-
logler view app.log -n 1000
|
|
528
|
+
logler view app.log -n 1000 # Show more lines
|
|
502
529
|
```
|
|
503
530
|
|
|
504
531
|
## 🛠️ Development
|
|
@@ -523,11 +550,12 @@ ruff check logler
|
|
|
523
550
|
|
|
524
551
|
- **logler** - Main CLI command
|
|
525
552
|
- **Rich Terminal UI** - Beautiful colored output
|
|
526
|
-
- **FastAPI Web Server** - Modern web interface
|
|
527
|
-
- **WebSocket Support** - Real-time log streaming
|
|
528
553
|
- **Thread Tracker** - Correlation and grouping
|
|
529
554
|
- **Smart Parser** - Multi-format support
|
|
530
555
|
- **File Watcher** - Monitor for new files
|
|
556
|
+
- **LLM Investigation Engine** - Rust-powered analysis for AI agents
|
|
557
|
+
|
|
558
|
+
For web UI, see [logler-web](https://github.com/gabu-quest/logler-web).
|
|
531
559
|
|
|
532
560
|
## 🤝 Contributing
|
|
533
561
|
|
|
@@ -541,16 +569,15 @@ MIT License - see LICENSE file for details.
|
|
|
541
569
|
|
|
542
570
|
Built with:
|
|
543
571
|
- [Rich](https://github.com/Textualize/rich) - Beautiful terminal output
|
|
544
|
-
- [
|
|
545
|
-
- [
|
|
546
|
-
- [
|
|
547
|
-
- [Alpine.js](https://alpinejs.dev/) - Reactive components
|
|
572
|
+
- [Click](https://click.palletsprojects.com/) - CLI framework
|
|
573
|
+
- [DuckDB](https://duckdb.org/) - SQL analytics
|
|
574
|
+
- [PyO3](https://pyo3.rs/) - Rust/Python bindings
|
|
548
575
|
|
|
549
576
|
## 💡 Pro Tips
|
|
550
577
|
|
|
551
578
|
1. **Use `--follow` mode** for real-time debugging
|
|
552
579
|
2. **Filter by thread** to trace execution flow
|
|
553
|
-
3. **Use
|
|
580
|
+
3. **Use `--auto-insights`** for automatic issue detection
|
|
554
581
|
4. **Export stats as JSON** for automation
|
|
555
582
|
5. **Watch directories** for new log files
|
|
556
583
|
|
|
@@ -575,13 +602,15 @@ logler view app.log -f --level ERROR
|
|
|
575
602
|
logler view app.log --thread worker-1
|
|
576
603
|
```
|
|
577
604
|
|
|
578
|
-
###
|
|
605
|
+
### Investigate with insights
|
|
579
606
|
```bash
|
|
580
|
-
logler
|
|
581
|
-
#
|
|
607
|
+
logler investigate app.log --auto-insights
|
|
608
|
+
# Automatic pattern detection and issue analysis
|
|
582
609
|
```
|
|
583
610
|
|
|
584
611
|
---
|
|
585
612
|
|
|
586
613
|
**Made with ❤️ for developers who love beautiful tools**
|
|
587
614
|
|
|
615
|
+
*For a web interface, check out [logler-web](https://github.com/gabu-quest/logler-web)*
|
|
616
|
+
|