Latest commit

History

1 Commit

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

log-proc

log-proc is a small Go CLI tool for reading, filtering, and summarizing log files.

The project was built as a practical Go training project focused on CLI input, file processing, parsing, state management, error handling, refactoring, and testing.

Features

  • Reads log lines from a file.

  • Parses log entries into date, time, level, message, and raw line.

  • Supports log levels:

    • ERROR
    • WARN
    • INFO
    • OTHER
  • Treats unknown levels such as DEBUG, TRACE, or NOTICE as OTHER.

  • Counts:

    • total valid log lines
    • errors
    • warnings
    • info messages
    • other messages
    • invalid lines
  • Filters selected entries by log level.

  • Supports summary-only mode.

  • Supports debug output for selected parsed entries.

  • Can write selected raw log lines to an output file.

  • Includes table-driven tests for parser logic, counters, filters, and stream processing.

Project structure

log-processor/
├── cmd/
│ └── logproc/
│ ├── main.go
│ └── main_test.go
├── testdata/
│ └── sample.log
├── go.mod
└── README.md

Log format

Expected log line format:

DATE TIME LEVEL MESSAGE

Example:

2026-05-06 12:03:12 ERROR failed login attempt
2026-05-06 12:02:44 WARN high memory usage
2026-05-06 12:04:01 INFO request completed
2026-05-06 12:00:00 DEBUG cache miss

The message part is optional:

2026-05-06 12:09:44 ERROR

Invalid lines are lines with fewer than three fields:

broken line
qwe1 1

Blank lines are ignored.

Unknown levels are treated as OTHER:

2026-05-06 12:00:00 DEBUG cache miss
2026-02-03 17:41:02 TRACE request trace
2026-05-06 12:08:33 NOTICE background job finished

Usage

Run from the project root:

go run ./cmd/logproc -file testdata/sample.log

Build binary:

go build -o bin/log-proc ./cmd/logproc

Run binary:

./bin/log-proc -file testdata/sample.log

Flags

FlagDescriptionDefault
-filePath to input log filerequired
-levelFilter logs by level: ALL, ERROR, WARN, INFO, OTHERALL
-summaryPrint summary only, without printing each selected entryfalse
-debugPrint debug slice of selected parsed entriesfalse
-outputWrite selected raw log lines to a fileempty

Examples

Process all valid log lines

go run ./cmd/logproc -file testdata/sample.log

This reads the file, prints selected entries, and prints a summary.

Show only errors

go run ./cmd/logproc -file testdata/sample.log -level ERROR

This counts all valid log lines internally, but prints only entries with level ERROR.

Summary only

go run ./cmd/logproc -file testdata/sample.log -summary

This skips per-entry printing and prints only the final summary.

Filter unknown levels as OTHER

go run ./cmd/logproc -file testdata/sample.log -level OTHER

This selects lines with unknown levels such as DEBUG, TRACE, NOTICE, or any level that is not ERROR, WARN, or INFO.

Write selected lines to an output file

go run ./cmd/logproc -file testdata/sample.log -level ERROR -output selected.log

This writes selected raw log lines to selected.log.

Debug selected entries

go run ./cmd/logproc -file testdata/sample.log -level ERROR -debug

This prints selected entries normally and also prints the internal debug slice after processing.

Example input

The sample input file is located at:

testdata/sample.log

Example content:

2026-05-06 12:03:12 ERROR failed login attempt
2026-05-06 12:02:44 WARN high memory usage
2026-05-06 12:04:01 INFO request completed
2026-05-06 12:00:00 DEBUG cache miss
2026-02-03 17:41:02 TRACE request trace
broken line
2026-05-06 12:05:55 ERROR database timeout
2026-05-06 12:06:10 WARN slow response detected
2026-05-06 12:07:00 INFO user session closed
2026-05-06 12:08:33 NOTICE background job finished
qwe1 1
2026-05-06 12:09:44 ERROR

Testing

Run all tests:

go test ./...

Run tests with coverage:

go test -cover ./...

Generate coverage profile:

go test -coverprofile=coverage.out ./...

Open coverage report:

go tool cover -html=coverage.out

The test suite covers:

  • mode normalization
  • level detection
  • log line parsing
  • stats counting
  • level filtering
  • processing log streams through io.Reader
  • writing selected output through io.Writer
  • output enabled / disabled behavior
  • debug collection
  • invalid lines
  • blank lines
  • unknown levels mapped to OTHER
  • valid lines with no selected matches

Implementation overview

The current implementation is organized around a few core responsibilities:

main
├── buildFlags
├── buildConfig
└── run
├── open input/output resources
├── processLines
│ ├── scan input stream
│ ├── parse log line
│ ├── update stats
│ ├── filter selected entries
│ └── handleSelectedEntry
└── printFinalReports

Technical focus

This project was used to practice:

  • Go CLI flags
  • file input/output
  • bufio.Scanner
  • structs
  • pointers
  • constants
  • error wrapping with fmt.Errorf
  • state management with RunState
  • separation of config, runtime state, processing, and reporting
  • io.Reader / io.Writer abstractions
  • table-driven tests
  • edge-case testing
  • step-by-step refactoring of a growing CLI program

Notes

This is a learning-oriented CLI project. The goal was not to build a production-grade log analyzer, but to practice building, refactoring, and testing a small Go program with clear runtime flow and explicit boundaries.

About

A small Go CLI tool for reading, filtering, and summarizing log files.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Latest commit

History

1 Commit

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

log-proc

log-proc is a small Go CLI tool for reading, filtering, and summarizing log files.

The project was built as a practical Go training project focused on CLI input, file processing, parsing, state management, error handling, refactoring, and testing.

Features

  • Reads log lines from a file.

  • Parses log entries into date, time, level, message, and raw line.

  • Supports log levels:

    • ERROR
    • WARN
    • INFO
    • OTHER
  • Treats unknown levels such as DEBUG, TRACE, or NOTICE as OTHER.

  • Counts:

    • total valid log lines
    • errors
    • warnings
    • info messages
    • other messages
    • invalid lines
  • Filters selected entries by log level.

  • Supports summary-only mode.

  • Supports debug output for selected parsed entries.

  • Can write selected raw log lines to an output file.

  • Includes table-driven tests for parser logic, counters, filters, and stream processing.

Project structure

log-processor/
├── cmd/
│ └── logproc/
│ ├── main.go
│ └── main_test.go
├── testdata/
│ └── sample.log
├── go.mod
└── README.md

Log format

Expected log line format:

DATE TIME LEVEL MESSAGE

Example:

2026-05-06 12:03:12 ERROR failed login attempt
2026-05-06 12:02:44 WARN high memory usage
2026-05-06 12:04:01 INFO request completed
2026-05-06 12:00:00 DEBUG cache miss

The message part is optional:

2026-05-06 12:09:44 ERROR

Invalid lines are lines with fewer than three fields:

broken line
qwe1 1

Blank lines are ignored.

Unknown levels are treated as OTHER:

2026-05-06 12:00:00 DEBUG cache miss
2026-02-03 17:41:02 TRACE request trace
2026-05-06 12:08:33 NOTICE background job finished

Usage

Run from the project root:

go run ./cmd/logproc -file testdata/sample.log

Build binary:

go build -o bin/log-proc ./cmd/logproc

Run binary:

./bin/log-proc -file testdata/sample.log

Flags

FlagDescriptionDefault
-filePath to input log filerequired
-levelFilter logs by level: ALL, ERROR, WARN, INFO, OTHERALL
-summaryPrint summary only, without printing each selected entryfalse
-debugPrint debug slice of selected parsed entriesfalse
-outputWrite selected raw log lines to a fileempty

Examples

Process all valid log lines

go run ./cmd/logproc -file testdata/sample.log

This reads the file, prints selected entries, and prints a summary.

Show only errors

go run ./cmd/logproc -file testdata/sample.log -level ERROR

This counts all valid log lines internally, but prints only entries with level ERROR.

Summary only

go run ./cmd/logproc -file testdata/sample.log -summary

This skips per-entry printing and prints only the final summary.

Filter unknown levels as OTHER

go run ./cmd/logproc -file testdata/sample.log -level OTHER

This selects lines with unknown levels such as DEBUG, TRACE, NOTICE, or any level that is not ERROR, WARN, or INFO.

Write selected lines to an output file

go run ./cmd/logproc -file testdata/sample.log -level ERROR -output selected.log

This writes selected raw log lines to selected.log.

Debug selected entries

go run ./cmd/logproc -file testdata/sample.log -level ERROR -debug

This prints selected entries normally and also prints the internal debug slice after processing.

Example input

The sample input file is located at:

testdata/sample.log

Example content:

2026-05-06 12:03:12 ERROR failed login attempt
2026-05-06 12:02:44 WARN high memory usage
2026-05-06 12:04:01 INFO request completed
2026-05-06 12:00:00 DEBUG cache miss
2026-02-03 17:41:02 TRACE request trace
broken line
2026-05-06 12:05:55 ERROR database timeout
2026-05-06 12:06:10 WARN slow response detected
2026-05-06 12:07:00 INFO user session closed
2026-05-06 12:08:33 NOTICE background job finished
qwe1 1
2026-05-06 12:09:44 ERROR

Testing

Run all tests:

go test ./...

Run tests with coverage:

go test -cover ./...

Generate coverage profile:

go test -coverprofile=coverage.out ./...

Open coverage report:

go tool cover -html=coverage.out

The test suite covers:

  • mode normalization
  • level detection
  • log line parsing
  • stats counting
  • level filtering
  • processing log streams through io.Reader
  • writing selected output through io.Writer
  • output enabled / disabled behavior
  • debug collection
  • invalid lines
  • blank lines
  • unknown levels mapped to OTHER
  • valid lines with no selected matches

Implementation overview

The current implementation is organized around a few core responsibilities:

main
├── buildFlags
├── buildConfig
└── run
├── open input/output resources
├── processLines
│ ├── scan input stream
│ ├── parse log line
│ ├── update stats
│ ├── filter selected entries
│ └── handleSelectedEntry
└── printFinalReports

Technical focus

This project was used to practice:

  • Go CLI flags
  • file input/output
  • bufio.Scanner
  • structs
  • pointers
  • constants
  • error wrapping with fmt.Errorf
  • state management with RunState
  • separation of config, runtime state, processing, and reporting
  • io.Reader / io.Writer abstractions
  • table-driven tests
  • edge-case testing
  • step-by-step refactoring of a growing CLI program

Notes

This is a learning-oriented CLI project. The goal was not to build a production-grade log analyzer, but to practice building, refactoring, and testing a small Go program with clear runtime flow and explicit boundaries.

About

A small Go CLI tool for reading, filtering, and summarizing log files.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

1 Commit

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

log-proc

log-proc is a small Go CLI tool for reading, filtering, and summarizing log files.

The project was built as a practical Go training project focused on CLI input, file processing, parsing, state management, error handling, refactoring, and testing.

Features

  • Reads log lines from a file.

  • Parses log entries into date, time, level, message, and raw line.

  • Supports log levels:

    • ERROR
    • WARN
    • INFO
    • OTHER
  • Treats unknown levels such as DEBUG, TRACE, or NOTICE as OTHER.

  • Counts:

    • total valid log lines
    • errors
    • warnings
    • info messages
    • other messages
    • invalid lines
  • Filters selected entries by log level.

  • Supports summary-only mode.

  • Supports debug output for selected parsed entries.

  • Can write selected raw log lines to an output file.

  • Includes table-driven tests for parser logic, counters, filters, and stream processing.

Project structure

log-processor/
├── cmd/
│ └── logproc/
│ ├── main.go
│ └── main_test.go
├── testdata/
│ └── sample.log
├── go.mod
└── README.md

Log format

Expected log line format:

DATE TIME LEVEL MESSAGE

Example:

2026-05-06 12:03:12 ERROR failed login attempt
2026-05-06 12:02:44 WARN high memory usage
2026-05-06 12:04:01 INFO request completed
2026-05-06 12:00:00 DEBUG cache miss

The message part is optional:

2026-05-06 12:09:44 ERROR

Invalid lines are lines with fewer than three fields:

broken line
qwe1 1

Blank lines are ignored.

Unknown levels are treated as OTHER:

2026-05-06 12:00:00 DEBUG cache miss
2026-02-03 17:41:02 TRACE request trace
2026-05-06 12:08:33 NOTICE background job finished

Usage

Run from the project root:

go run ./cmd/logproc -file testdata/sample.log

Build binary:

go build -o bin/log-proc ./cmd/logproc

Run binary:

./bin/log-proc -file testdata/sample.log

Flags

FlagDescriptionDefault
-filePath to input log filerequired
-levelFilter logs by level: ALL, ERROR, WARN, INFO, OTHERALL
-summaryPrint summary only, without printing each selected entryfalse
-debugPrint debug slice of selected parsed entriesfalse
-outputWrite selected raw log lines to a fileempty

Examples

Process all valid log lines

go run ./cmd/logproc -file testdata/sample.log

This reads the file, prints selected entries, and prints a summary.

Show only errors

go run ./cmd/logproc -file testdata/sample.log -level ERROR

This counts all valid log lines internally, but prints only entries with level ERROR.

Summary only

go run ./cmd/logproc -file testdata/sample.log -summary

This skips per-entry printing and prints only the final summary.

Filter unknown levels as OTHER

go run ./cmd/logproc -file testdata/sample.log -level OTHER

This selects lines with unknown levels such as DEBUG, TRACE, NOTICE, or any level that is not ERROR, WARN, or INFO.

Write selected lines to an output file

go run ./cmd/logproc -file testdata/sample.log -level ERROR -output selected.log

This writes selected raw log lines to selected.log.

Debug selected entries

go run ./cmd/logproc -file testdata/sample.log -level ERROR -debug

This prints selected entries normally and also prints the internal debug slice after processing.

Example input

The sample input file is located at:

testdata/sample.log

Example content:

2026-05-06 12:03:12 ERROR failed login attempt
2026-05-06 12:02:44 WARN high memory usage
2026-05-06 12:04:01 INFO request completed
2026-05-06 12:00:00 DEBUG cache miss
2026-02-03 17:41:02 TRACE request trace
broken line
2026-05-06 12:05:55 ERROR database timeout
2026-05-06 12:06:10 WARN slow response detected
2026-05-06 12:07:00 INFO user session closed
2026-05-06 12:08:33 NOTICE background job finished
qwe1 1
2026-05-06 12:09:44 ERROR

Testing

Run all tests:

go test ./...

Run tests with coverage:

go test -cover ./...

Generate coverage profile:

go test -coverprofile=coverage.out ./...

Open coverage report:

go tool cover -html=coverage.out

The test suite covers:

  • mode normalization
  • level detection
  • log line parsing
  • stats counting
  • level filtering
  • processing log streams through io.Reader
  • writing selected output through io.Writer
  • output enabled / disabled behavior
  • debug collection
  • invalid lines
  • blank lines
  • unknown levels mapped to OTHER
  • valid lines with no selected matches

Implementation overview

The current implementation is organized around a few core responsibilities:

main
├── buildFlags
├── buildConfig
└── run
├── open input/output resources
├── processLines
│ ├── scan input stream
│ ├── parse log line
│ ├── update stats
│ ├── filter selected entries
│ └── handleSelectedEntry
└── printFinalReports

Technical focus

This project was used to practice:

  • Go CLI flags
  • file input/output
  • bufio.Scanner
  • structs
  • pointers
  • constants
  • error wrapping with fmt.Errorf
  • state management with RunState
  • separation of config, runtime state, processing, and reporting
  • io.Reader / io.Writer abstractions
  • table-driven tests
  • edge-case testing
  • step-by-step refactoring of a growing CLI program

Notes

This is a learning-oriented CLI project. The goal was not to build a production-grade log analyzer, but to practice building, refactoring, and testing a small Go program with clear runtime flow and explicit boundaries.

About

A small Go CLI tool for reading, filtering, and summarizing log files.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

1 Commit

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

log-proc

log-proc is a small Go CLI tool for reading, filtering, and summarizing log files.

The project was built as a practical Go training project focused on CLI input, file processing, parsing, state management, error handling, refactoring, and testing.

Features

  • Reads log lines from a file.

  • Parses log entries into date, time, level, message, and raw line.

  • Supports log levels:

    • ERROR
    • WARN
    • INFO
    • OTHER
  • Treats unknown levels such as DEBUG, TRACE, or NOTICE as OTHER.

  • Counts:

    • total valid log lines
    • errors
    • warnings
    • info messages
    • other messages
    • invalid lines
  • Filters selected entries by log level.

  • Supports summary-only mode.

  • Supports debug output for selected parsed entries.

  • Can write selected raw log lines to an output file.

  • Includes table-driven tests for parser logic, counters, filters, and stream processing.

Project structure

log-processor/
├── cmd/
│ └── logproc/
│ ├── main.go
│ └── main_test.go
├── testdata/
│ └── sample.log
├── go.mod
└── README.md

Log format

Expected log line format:

DATE TIME LEVEL MESSAGE

Example:

2026-05-06 12:03:12 ERROR failed login attempt
2026-05-06 12:02:44 WARN high memory usage
2026-05-06 12:04:01 INFO request completed
2026-05-06 12:00:00 DEBUG cache miss

The message part is optional:

2026-05-06 12:09:44 ERROR

Invalid lines are lines with fewer than three fields:

broken line
qwe1 1

Blank lines are ignored.

Unknown levels are treated as OTHER:

2026-05-06 12:00:00 DEBUG cache miss
2026-02-03 17:41:02 TRACE request trace
2026-05-06 12:08:33 NOTICE background job finished

Usage

Run from the project root:

go run ./cmd/logproc -file testdata/sample.log

Build binary:

go build -o bin/log-proc ./cmd/logproc

Run binary:

./bin/log-proc -file testdata/sample.log

Flags

FlagDescriptionDefault
-filePath to input log filerequired
-levelFilter logs by level: ALL, ERROR, WARN, INFO, OTHERALL
-summaryPrint summary only, without printing each selected entryfalse
-debugPrint debug slice of selected parsed entriesfalse
-outputWrite selected raw log lines to a fileempty

Examples

Process all valid log lines

go run ./cmd/logproc -file testdata/sample.log

This reads the file, prints selected entries, and prints a summary.

Show only errors

go run ./cmd/logproc -file testdata/sample.log -level ERROR

This counts all valid log lines internally, but prints only entries with level ERROR.

Summary only

go run ./cmd/logproc -file testdata/sample.log -summary

This skips per-entry printing and prints only the final summary.

Filter unknown levels as OTHER

go run ./cmd/logproc -file testdata/sample.log -level OTHER

This selects lines with unknown levels such as DEBUG, TRACE, NOTICE, or any level that is not ERROR, WARN, or INFO.

Write selected lines to an output file

go run ./cmd/logproc -file testdata/sample.log -level ERROR -output selected.log

This writes selected raw log lines to selected.log.

Debug selected entries

go run ./cmd/logproc -file testdata/sample.log -level ERROR -debug

This prints selected entries normally and also prints the internal debug slice after processing.

Example input

The sample input file is located at:

testdata/sample.log

Example content:

2026-05-06 12:03:12 ERROR failed login attempt
2026-05-06 12:02:44 WARN high memory usage
2026-05-06 12:04:01 INFO request completed
2026-05-06 12:00:00 DEBUG cache miss
2026-02-03 17:41:02 TRACE request trace
broken line
2026-05-06 12:05:55 ERROR database timeout
2026-05-06 12:06:10 WARN slow response detected
2026-05-06 12:07:00 INFO user session closed
2026-05-06 12:08:33 NOTICE background job finished
qwe1 1
2026-05-06 12:09:44 ERROR

Testing

Run all tests:

go test ./...

Run tests with coverage:

go test -cover ./...

Generate coverage profile:

go test -coverprofile=coverage.out ./...

Open coverage report:

go tool cover -html=coverage.out

The test suite covers:

  • mode normalization
  • level detection
  • log line parsing
  • stats counting
  • level filtering
  • processing log streams through io.Reader
  • writing selected output through io.Writer
  • output enabled / disabled behavior
  • debug collection
  • invalid lines
  • blank lines
  • unknown levels mapped to OTHER
  • valid lines with no selected matches

Implementation overview

The current implementation is organized around a few core responsibilities:

main
├── buildFlags
├── buildConfig
└── run
├── open input/output resources
├── processLines
│ ├── scan input stream
│ ├── parse log line
│ ├── update stats
│ ├── filter selected entries
│ └── handleSelectedEntry
└── printFinalReports

Technical focus

This project was used to practice:

  • Go CLI flags
  • file input/output
  • bufio.Scanner
  • structs
  • pointers
  • constants
  • error wrapping with fmt.Errorf
  • state management with RunState
  • separation of config, runtime state, processing, and reporting
  • io.Reader / io.Writer abstractions
  • table-driven tests
  • edge-case testing
  • step-by-step refactoring of a growing CLI program

Notes

This is a learning-oriented CLI project. The goal was not to build a production-grade log analyzer, but to practice building, refactoring, and testing a small Go program with clear runtime flow and explicit boundaries.

About

A small Go CLI tool for reading, filtering, and summarizing log files.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Latest commit

History

1 Commit

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

log-proc

log-proc is a small Go CLI tool for reading, filtering, and summarizing log files.

The project was built as a practical Go training project focused on CLI input, file processing, parsing, state management, error handling, refactoring, and testing.

Features

  • Reads log lines from a file.

  • Parses log entries into date, time, level, message, and raw line.

  • Supports log levels:

    • ERROR
    • WARN
    • INFO
    • OTHER
  • Treats unknown levels such as DEBUG, TRACE, or NOTICE as OTHER.

  • Counts:

    • total valid log lines
    • errors
    • warnings
    • info messages
    • other messages
    • invalid lines
  • Filters selected entries by log level.

  • Supports summary-only mode.

  • Supports debug output for selected parsed entries.

  • Can write selected raw log lines to an output file.

  • Includes table-driven tests for parser logic, counters, filters, and stream processing.

Project structure

log-processor/
├── cmd/
│ └── logproc/
│ ├── main.go
│ └── main_test.go
├── testdata/
│ └── sample.log
├── go.mod
└── README.md

Log format

Expected log line format:

DATE TIME LEVEL MESSAGE

Example:

2026-05-06 12:03:12 ERROR failed login attempt
2026-05-06 12:02:44 WARN high memory usage
2026-05-06 12:04:01 INFO request completed
2026-05-06 12:00:00 DEBUG cache miss

The message part is optional:

2026-05-06 12:09:44 ERROR

Invalid lines are lines with fewer than three fields:

broken line
qwe1 1

Blank lines are ignored.

Unknown levels are treated as OTHER:

2026-05-06 12:00:00 DEBUG cache miss
2026-02-03 17:41:02 TRACE request trace
2026-05-06 12:08:33 NOTICE background job finished

Usage

Run from the project root:

go run ./cmd/logproc -file testdata/sample.log

Build binary:

go build -o bin/log-proc ./cmd/logproc

Run binary:

./bin/log-proc -file testdata/sample.log

Flags

FlagDescriptionDefault
-filePath to input log filerequired
-levelFilter logs by level: ALL, ERROR, WARN, INFO, OTHERALL
-summaryPrint summary only, without printing each selected entryfalse
-debugPrint debug slice of selected parsed entriesfalse
-outputWrite selected raw log lines to a fileempty

Examples

Process all valid log lines

go run ./cmd/logproc -file testdata/sample.log

This reads the file, prints selected entries, and prints a summary.

Show only errors

go run ./cmd/logproc -file testdata/sample.log -level ERROR

This counts all valid log lines internally, but prints only entries with level ERROR.

Summary only

go run ./cmd/logproc -file testdata/sample.log -summary

This skips per-entry printing and prints only the final summary.

Filter unknown levels as OTHER

go run ./cmd/logproc -file testdata/sample.log -level OTHER

This selects lines with unknown levels such as DEBUG, TRACE, NOTICE, or any level that is not ERROR, WARN, or INFO.

Write selected lines to an output file

go run ./cmd/logproc -file testdata/sample.log -level ERROR -output selected.log

This writes selected raw log lines to selected.log.

Debug selected entries

go run ./cmd/logproc -file testdata/sample.log -level ERROR -debug

This prints selected entries normally and also prints the internal debug slice after processing.

Example input

The sample input file is located at:

testdata/sample.log

Example content:

2026-05-06 12:03:12 ERROR failed login attempt
2026-05-06 12:02:44 WARN high memory usage
2026-05-06 12:04:01 INFO request completed
2026-05-06 12:00:00 DEBUG cache miss
2026-02-03 17:41:02 TRACE request trace
broken line
2026-05-06 12:05:55 ERROR database timeout
2026-05-06 12:06:10 WARN slow response detected
2026-05-06 12:07:00 INFO user session closed
2026-05-06 12:08:33 NOTICE background job finished
qwe1 1
2026-05-06 12:09:44 ERROR

Testing

Run all tests:

go test ./...

Run tests with coverage:

go test -cover ./...

Generate coverage profile:

go test -coverprofile=coverage.out ./...

Open coverage report:

go tool cover -html=coverage.out

The test suite covers:

  • mode normalization
  • level detection
  • log line parsing
  • stats counting
  • level filtering
  • processing log streams through io.Reader
  • writing selected output through io.Writer
  • output enabled / disabled behavior
  • debug collection
  • invalid lines
  • blank lines
  • unknown levels mapped to OTHER
  • valid lines with no selected matches

Implementation overview

The current implementation is organized around a few core responsibilities:

main
├── buildFlags
├── buildConfig
└── run
├── open input/output resources
├── processLines
│ ├── scan input stream
│ ├── parse log line
│ ├── update stats
│ ├── filter selected entries
│ └── handleSelectedEntry
└── printFinalReports

Technical focus

This project was used to practice:

  • Go CLI flags
  • file input/output
  • bufio.Scanner
  • structs
  • pointers
  • constants
  • error wrapping with fmt.Errorf
  • state management with RunState
  • separation of config, runtime state, processing, and reporting
  • io.Reader / io.Writer abstractions
  • table-driven tests
  • edge-case testing
  • step-by-step refactoring of a growing CLI program

Notes

This is a learning-oriented CLI project. The goal was not to build a production-grade log analyzer, but to practice building, refactoring, and testing a small Go program with clear runtime flow and explicit boundaries.

About

A small Go CLI tool for reading, filtering, and summarizing log files.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

1 Commit

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

log-proc

log-proc is a small Go CLI tool for reading, filtering, and summarizing log files.

The project was built as a practical Go training project focused on CLI input, file processing, parsing, state management, error handling, refactoring, and testing.

Features

  • Reads log lines from a file.

  • Parses log entries into date, time, level, message, and raw line.

  • Supports log levels:

    • ERROR
    • WARN
    • INFO
    • OTHER
  • Treats unknown levels such as DEBUG, TRACE, or NOTICE as OTHER.

  • Counts:

    • total valid log lines
    • errors
    • warnings
    • info messages
    • other messages
    • invalid lines
  • Filters selected entries by log level.

  • Supports summary-only mode.

  • Supports debug output for selected parsed entries.

  • Can write selected raw log lines to an output file.

  • Includes table-driven tests for parser logic, counters, filters, and stream processing.

Project structure

log-processor/
├── cmd/
│ └── logproc/
│ ├── main.go
│ └── main_test.go
├── testdata/
│ └── sample.log
├── go.mod
└── README.md

Log format

Expected log line format:

DATE TIME LEVEL MESSAGE

Example:

2026-05-06 12:03:12 ERROR failed login attempt
2026-05-06 12:02:44 WARN high memory usage
2026-05-06 12:04:01 INFO request completed
2026-05-06 12:00:00 DEBUG cache miss

The message part is optional:

2026-05-06 12:09:44 ERROR

Invalid lines are lines with fewer than three fields:

broken line
qwe1 1

Blank lines are ignored.

Unknown levels are treated as OTHER:

2026-05-06 12:00:00 DEBUG cache miss
2026-02-03 17:41:02 TRACE request trace
2026-05-06 12:08:33 NOTICE background job finished

Usage

Run from the project root:

go run ./cmd/logproc -file testdata/sample.log

Build binary:

go build -o bin/log-proc ./cmd/logproc

Run binary:

./bin/log-proc -file testdata/sample.log

Flags

FlagDescriptionDefault
-filePath to input log filerequired
-levelFilter logs by level: ALL, ERROR, WARN, INFO, OTHERALL
-summaryPrint summary only, without printing each selected entryfalse
-debugPrint debug slice of selected parsed entriesfalse
-outputWrite selected raw log lines to a fileempty

Examples

Process all valid log lines

go run ./cmd/logproc -file testdata/sample.log

This reads the file, prints selected entries, and prints a summary.

Show only errors

go run ./cmd/logproc -file testdata/sample.log -level ERROR

This counts all valid log lines internally, but prints only entries with level ERROR.

Summary only

go run ./cmd/logproc -file testdata/sample.log -summary

This skips per-entry printing and prints only the final summary.

Filter unknown levels as OTHER

go run ./cmd/logproc -file testdata/sample.log -level OTHER

This selects lines with unknown levels such as DEBUG, TRACE, NOTICE, or any level that is not ERROR, WARN, or INFO.

Write selected lines to an output file

go run ./cmd/logproc -file testdata/sample.log -level ERROR -output selected.log

This writes selected raw log lines to selected.log.

Debug selected entries

go run ./cmd/logproc -file testdata/sample.log -level ERROR -debug

This prints selected entries normally and also prints the internal debug slice after processing.

Example input

The sample input file is located at:

testdata/sample.log

Example content:

2026-05-06 12:03:12 ERROR failed login attempt
2026-05-06 12:02:44 WARN high memory usage
2026-05-06 12:04:01 INFO request completed
2026-05-06 12:00:00 DEBUG cache miss
2026-02-03 17:41:02 TRACE request trace
broken line
2026-05-06 12:05:55 ERROR database timeout
2026-05-06 12:06:10 WARN slow response detected
2026-05-06 12:07:00 INFO user session closed
2026-05-06 12:08:33 NOTICE background job finished
qwe1 1
2026-05-06 12:09:44 ERROR

Testing

Run all tests:

go test ./...

Run tests with coverage:

go test -cover ./...

Generate coverage profile:

go test -coverprofile=coverage.out ./...

Open coverage report:

go tool cover -html=coverage.out

The test suite covers:

  • mode normalization
  • level detection
  • log line parsing
  • stats counting
  • level filtering
  • processing log streams through io.Reader
  • writing selected output through io.Writer
  • output enabled / disabled behavior
  • debug collection
  • invalid lines
  • blank lines
  • unknown levels mapped to OTHER
  • valid lines with no selected matches

Implementation overview

The current implementation is organized around a few core responsibilities:

main
├── buildFlags
├── buildConfig
└── run
├── open input/output resources
├── processLines
│ ├── scan input stream
│ ├── parse log line
│ ├── update stats
│ ├── filter selected entries
│ └── handleSelectedEntry
└── printFinalReports

Technical focus

This project was used to practice:

  • Go CLI flags
  • file input/output
  • bufio.Scanner
  • structs
  • pointers
  • constants
  • error wrapping with fmt.Errorf
  • state management with RunState
  • separation of config, runtime state, processing, and reporting
  • io.Reader / io.Writer abstractions
  • table-driven tests
  • edge-case testing
  • step-by-step refactoring of a growing CLI program

Notes

This is a learning-oriented CLI project. The goal was not to build a production-grade log analyzer, but to practice building, refactoring, and testing a small Go program with clear runtime flow and explicit boundaries.

About

A small Go CLI tool for reading, filtering, and summarizing log files.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

1 Commit

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

log-proc

log-proc is a small Go CLI tool for reading, filtering, and summarizing log files.

The project was built as a practical Go training project focused on CLI input, file processing, parsing, state management, error handling, refactoring, and testing.

Features

  • Reads log lines from a file.

  • Parses log entries into date, time, level, message, and raw line.

  • Supports log levels:

    • ERROR
    • WARN
    • INFO
    • OTHER
  • Treats unknown levels such as DEBUG, TRACE, or NOTICE as OTHER.

  • Counts:

    • total valid log lines
    • errors
    • warnings
    • info messages
    • other messages
    • invalid lines
  • Filters selected entries by log level.

  • Supports summary-only mode.

  • Supports debug output for selected parsed entries.

  • Can write selected raw log lines to an output file.

  • Includes table-driven tests for parser logic, counters, filters, and stream processing.

Project structure

log-processor/
├── cmd/
│ └── logproc/
│ ├── main.go
│ └── main_test.go
├── testdata/
│ └── sample.log
├── go.mod
└── README.md

Log format

Expected log line format:

DATE TIME LEVEL MESSAGE

Example:

2026-05-06 12:03:12 ERROR failed login attempt
2026-05-06 12:02:44 WARN high memory usage
2026-05-06 12:04:01 INFO request completed
2026-05-06 12:00:00 DEBUG cache miss

The message part is optional:

2026-05-06 12:09:44 ERROR

Invalid lines are lines with fewer than three fields:

broken line
qwe1 1

Blank lines are ignored.

Unknown levels are treated as OTHER:

2026-05-06 12:00:00 DEBUG cache miss
2026-02-03 17:41:02 TRACE request trace
2026-05-06 12:08:33 NOTICE background job finished

Usage

Run from the project root:

go run ./cmd/logproc -file testdata/sample.log

Build binary:

go build -o bin/log-proc ./cmd/logproc

Run binary:

./bin/log-proc -file testdata/sample.log

Flags

FlagDescriptionDefault
-filePath to input log filerequired
-levelFilter logs by level: ALL, ERROR, WARN, INFO, OTHERALL
-summaryPrint summary only, without printing each selected entryfalse
-debugPrint debug slice of selected parsed entriesfalse
-outputWrite selected raw log lines to a fileempty

Examples

Process all valid log lines

go run ./cmd/logproc -file testdata/sample.log

This reads the file, prints selected entries, and prints a summary.

Show only errors

go run ./cmd/logproc -file testdata/sample.log -level ERROR

This counts all valid log lines internally, but prints only entries with level ERROR.

Summary only

go run ./cmd/logproc -file testdata/sample.log -summary

This skips per-entry printing and prints only the final summary.

Filter unknown levels as OTHER

go run ./cmd/logproc -file testdata/sample.log -level OTHER

This selects lines with unknown levels such as DEBUG, TRACE, NOTICE, or any level that is not ERROR, WARN, or INFO.

Write selected lines to an output file

go run ./cmd/logproc -file testdata/sample.log -level ERROR -output selected.log

This writes selected raw log lines to selected.log.

Debug selected entries

go run ./cmd/logproc -file testdata/sample.log -level ERROR -debug

This prints selected entries normally and also prints the internal debug slice after processing.

Example input

The sample input file is located at:

testdata/sample.log

Example content:

2026-05-06 12:03:12 ERROR failed login attempt
2026-05-06 12:02:44 WARN high memory usage
2026-05-06 12:04:01 INFO request completed
2026-05-06 12:00:00 DEBUG cache miss
2026-02-03 17:41:02 TRACE request trace
broken line
2026-05-06 12:05:55 ERROR database timeout
2026-05-06 12:06:10 WARN slow response detected
2026-05-06 12:07:00 INFO user session closed
2026-05-06 12:08:33 NOTICE background job finished
qwe1 1
2026-05-06 12:09:44 ERROR

Testing

Run all tests:

go test ./...

Run tests with coverage:

go test -cover ./...

Generate coverage profile:

go test -coverprofile=coverage.out ./...

Open coverage report:

go tool cover -html=coverage.out

The test suite covers:

  • mode normalization
  • level detection
  • log line parsing
  • stats counting
  • level filtering
  • processing log streams through io.Reader
  • writing selected output through io.Writer
  • output enabled / disabled behavior
  • debug collection
  • invalid lines
  • blank lines
  • unknown levels mapped to OTHER
  • valid lines with no selected matches

Implementation overview

The current implementation is organized around a few core responsibilities:

main
├── buildFlags
├── buildConfig
└── run
├── open input/output resources
├── processLines
│ ├── scan input stream
│ ├── parse log line
│ ├── update stats
│ ├── filter selected entries
│ └── handleSelectedEntry
└── printFinalReports

Technical focus

This project was used to practice:

  • Go CLI flags
  • file input/output
  • bufio.Scanner
  • structs
  • pointers
  • constants
  • error wrapping with fmt.Errorf
  • state management with RunState
  • separation of config, runtime state, processing, and reporting
  • io.Reader / io.Writer abstractions
  • table-driven tests
  • edge-case testing
  • step-by-step refactoring of a growing CLI program

Notes

This is a learning-oriented CLI project. The goal was not to build a production-grade log analyzer, but to practice building, refactoring, and testing a small Go program with clear runtime flow and explicit boundaries.

About

A small Go CLI tool for reading, filtering, and summarizing log files.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Latest commit

History

1 Commit

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

log-proc

log-proc is a small Go CLI tool for reading, filtering, and summarizing log files.

The project was built as a practical Go training project focused on CLI input, file processing, parsing, state management, error handling, refactoring, and testing.

Features

  • Reads log lines from a file.

  • Parses log entries into date, time, level, message, and raw line.

  • Supports log levels:

    • ERROR
    • WARN
    • INFO
    • OTHER
  • Treats unknown levels such as DEBUG, TRACE, or NOTICE as OTHER.

  • Counts:

    • total valid log lines
    • errors
    • warnings
    • info messages
    • other messages
    • invalid lines
  • Filters selected entries by log level.

  • Supports summary-only mode.

  • Supports debug output for selected parsed entries.

  • Can write selected raw log lines to an output file.

  • Includes table-driven tests for parser logic, counters, filters, and stream processing.

Project structure

log-processor/
├── cmd/
│ └── logproc/
│ ├── main.go
│ └── main_test.go
├── testdata/
│ └── sample.log
├── go.mod
└── README.md

Log format

Expected log line format:

DATE TIME LEVEL MESSAGE

Example:

2026-05-06 12:03:12 ERROR failed login attempt
2026-05-06 12:02:44 WARN high memory usage
2026-05-06 12:04:01 INFO request completed
2026-05-06 12:00:00 DEBUG cache miss

The message part is optional:

2026-05-06 12:09:44 ERROR

Invalid lines are lines with fewer than three fields:

broken line
qwe1 1

Blank lines are ignored.

Unknown levels are treated as OTHER:

2026-05-06 12:00:00 DEBUG cache miss
2026-02-03 17:41:02 TRACE request trace
2026-05-06 12:08:33 NOTICE background job finished

Usage

Run from the project root:

go run ./cmd/logproc -file testdata/sample.log

Build binary:

go build -o bin/log-proc ./cmd/logproc

Run binary:

./bin/log-proc -file testdata/sample.log

Flags

FlagDescriptionDefault
-filePath to input log filerequired
-levelFilter logs by level: ALL, ERROR, WARN, INFO, OTHERALL
-summaryPrint summary only, without printing each selected entryfalse
-debugPrint debug slice of selected parsed entriesfalse
-outputWrite selected raw log lines to a fileempty

Examples

Process all valid log lines

go run ./cmd/logproc -file testdata/sample.log

This reads the file, prints selected entries, and prints a summary.

Show only errors

go run ./cmd/logproc -file testdata/sample.log -level ERROR

This counts all valid log lines internally, but prints only entries with level ERROR.

Summary only

go run ./cmd/logproc -file testdata/sample.log -summary

This skips per-entry printing and prints only the final summary.

Filter unknown levels as OTHER

go run ./cmd/logproc -file testdata/sample.log -level OTHER

This selects lines with unknown levels such as DEBUG, TRACE, NOTICE, or any level that is not ERROR, WARN, or INFO.

Write selected lines to an output file

go run ./cmd/logproc -file testdata/sample.log -level ERROR -output selected.log

This writes selected raw log lines to selected.log.

Debug selected entries

go run ./cmd/logproc -file testdata/sample.log -level ERROR -debug

This prints selected entries normally and also prints the internal debug slice after processing.

Example input

The sample input file is located at:

testdata/sample.log

Example content:

2026-05-06 12:03:12 ERROR failed login attempt
2026-05-06 12:02:44 WARN high memory usage
2026-05-06 12:04:01 INFO request completed
2026-05-06 12:00:00 DEBUG cache miss
2026-02-03 17:41:02 TRACE request trace
broken line
2026-05-06 12:05:55 ERROR database timeout
2026-05-06 12:06:10 WARN slow response detected
2026-05-06 12:07:00 INFO user session closed
2026-05-06 12:08:33 NOTICE background job finished
qwe1 1
2026-05-06 12:09:44 ERROR

Testing

Run all tests:

go test ./...

Run tests with coverage:

go test -cover ./...

Generate coverage profile:

go test -coverprofile=coverage.out ./...

Open coverage report:

go tool cover -html=coverage.out

The test suite covers:

  • mode normalization
  • level detection
  • log line parsing
  • stats counting
  • level filtering
  • processing log streams through io.Reader
  • writing selected output through io.Writer
  • output enabled / disabled behavior
  • debug collection
  • invalid lines
  • blank lines
  • unknown levels mapped to OTHER
  • valid lines with no selected matches

Implementation overview

The current implementation is organized around a few core responsibilities:

main
├── buildFlags
├── buildConfig
└── run
├── open input/output resources
├── processLines
│ ├── scan input stream
│ ├── parse log line
│ ├── update stats
│ ├── filter selected entries
│ └── handleSelectedEntry
└── printFinalReports

Technical focus

This project was used to practice:

  • Go CLI flags
  • file input/output
  • bufio.Scanner
  • structs
  • pointers
  • constants
  • error wrapping with fmt.Errorf
  • state management with RunState
  • separation of config, runtime state, processing, and reporting
  • io.Reader / io.Writer abstractions
  • table-driven tests
  • edge-case testing
  • step-by-step refactoring of a growing CLI program

Notes

This is a learning-oriented CLI project. The goal was not to build a production-grade log analyzer, but to practice building, refactoring, and testing a small Go program with clear runtime flow and explicit boundaries.

About

A small Go CLI tool for reading, filtering, and summarizing log files.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Contributors

Languages