Latest commit

History

7 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

gkats/httplog

Package httplog provides logging for http requests.

Apart from a ready to use logger that can be used freely, the package also provides a logging middleware (or wrapper) over http Handlers.

Install

$ go get github.com/gkats/httplog

Details

The functionality is purposely kept minimal. The logger outputs a small set of default parameters and provides an extensible way to log extra parameters if needed. The log format is a nice balance between human and machine readability.

The log output is one line per request. The parameters are separated with a blank space while the parameter key and its value are separated by the "=" character. Here's an example log output for a single request.

level=I time=2017-07-08T17:08:12UTC ip=193.92.20.19 method=GET path=/logs ua=Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36 status=200 params={}

Default log parameters

This is a complete list of the default parameters that are logged.

NameDescription
levelThe log output level. This will always be set to (I)nfo. There's really no need for any other log levels.
timeThe timestamp of the log entry. The date follows the ISO 8601 format (YYYY-MM-DDTHH:mm:ssZ)
ipThe request's IP. Takes into account the X-Forwarded-For header if it's set.
methodThe request method.
pathThe path for the request, leaving out the hostname part.
uaThe request's User-Agent header.
statusThe response status code.
paramsAny parameters that came with the request. The parameters will be logged in JSON format, even for non-JSON requests. The parameters are taken from either the request body or the query parameters (for GET requests).

Usage

Standalone

The logger needs a stream that implements the io.Writer interface. This is where all logging output will go.

type stream struct {}
func (s *stream) Write(p []byte) (n int, err error) {
// write somewhere
}
l := httplog.New(&stream{})
l.Log()

Middleware

If you're familiar with the http.Handler middleware pattern, you just need to provide your handler and a logger as arguments to the httplog.WithLogging function.

type customHandler {}
func (h *customHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(200)
// ...your handler logic goes here...
}
func main() {
// Configure a logger
l := httplog.New(os.Stdout)
// And use the middleware
http.Handle("/logs", httplog.WithLogging(&customHandler{}, l))
http.ListenAndServe(":8080", nil)
}

Performing a request to GET http://server.url:8080/logs?q=works will produce the following line in your server's standard output.

level=I time=2017-07-08T17:08:12UTC ip=193.92.20.19 method=GET path=/logs ua=Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36 status=200 params={"q": "works"}

Adding extra log parameters

Sometimes you might want to log some extra parameters, like information about the user making requests. You can use the logger's Add method and specify the parameter name and the value.

type User struct {
ID int
}
user := &User{ID: 1234}
l := httplog.New(os.Stdout)
l.Add("uid", user.ID)
l.Add("meta", "new-request")
l.Log()
// => level=I [...] uid=1234 meta=new-request

Contributing

Pull requests, bug fixes and issue reports are more than welcome! Please keep in mind that the goal is to keep the functionality minimal.

License

The package is released under the MIT License

About

Simple logger for HTTP requests https://godoc.org/github.com/gkats/httplog

Topics

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

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

7 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

gkats/httplog

Package httplog provides logging for http requests.

Apart from a ready to use logger that can be used freely, the package also provides a logging middleware (or wrapper) over http Handlers.

Install

$ go get github.com/gkats/httplog

Details

The functionality is purposely kept minimal. The logger outputs a small set of default parameters and provides an extensible way to log extra parameters if needed. The log format is a nice balance between human and machine readability.

The log output is one line per request. The parameters are separated with a blank space while the parameter key and its value are separated by the "=" character. Here's an example log output for a single request.

level=I time=2017-07-08T17:08:12UTC ip=193.92.20.19 method=GET path=/logs ua=Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36 status=200 params={}

Default log parameters

This is a complete list of the default parameters that are logged.

NameDescription
levelThe log output level. This will always be set to (I)nfo. There's really no need for any other log levels.
timeThe timestamp of the log entry. The date follows the ISO 8601 format (YYYY-MM-DDTHH:mm:ssZ)
ipThe request's IP. Takes into account the X-Forwarded-For header if it's set.
methodThe request method.
pathThe path for the request, leaving out the hostname part.
uaThe request's User-Agent header.
statusThe response status code.
paramsAny parameters that came with the request. The parameters will be logged in JSON format, even for non-JSON requests. The parameters are taken from either the request body or the query parameters (for GET requests).

Usage

Standalone

The logger needs a stream that implements the io.Writer interface. This is where all logging output will go.

type stream struct {}
func (s *stream) Write(p []byte) (n int, err error) {
// write somewhere
}
l := httplog.New(&stream{})
l.Log()

Middleware

If you're familiar with the http.Handler middleware pattern, you just need to provide your handler and a logger as arguments to the httplog.WithLogging function.

type customHandler {}
func (h *customHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(200)
// ...your handler logic goes here...
}
func main() {
// Configure a logger
l := httplog.New(os.Stdout)
// And use the middleware
http.Handle("/logs", httplog.WithLogging(&customHandler{}, l))
http.ListenAndServe(":8080", nil)
}

Performing a request to GET http://server.url:8080/logs?q=works will produce the following line in your server's standard output.

level=I time=2017-07-08T17:08:12UTC ip=193.92.20.19 method=GET path=/logs ua=Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36 status=200 params={"q": "works"}

Adding extra log parameters

Sometimes you might want to log some extra parameters, like information about the user making requests. You can use the logger's Add method and specify the parameter name and the value.

type User struct {
ID int
}
user := &User{ID: 1234}
l := httplog.New(os.Stdout)
l.Add("uid", user.ID)
l.Add("meta", "new-request")
l.Log()
// => level=I [...] uid=1234 meta=new-request

Contributing

Pull requests, bug fixes and issue reports are more than welcome! Please keep in mind that the goal is to keep the functionality minimal.

License

The package is released under the MIT License

About

Simple logger for HTTP requests https://godoc.org/github.com/gkats/httplog

Topics

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

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

7 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

gkats/httplog

Package httplog provides logging for http requests.

Apart from a ready to use logger that can be used freely, the package also provides a logging middleware (or wrapper) over http Handlers.

Install

$ go get github.com/gkats/httplog

Details

The functionality is purposely kept minimal. The logger outputs a small set of default parameters and provides an extensible way to log extra parameters if needed. The log format is a nice balance between human and machine readability.

The log output is one line per request. The parameters are separated with a blank space while the parameter key and its value are separated by the "=" character. Here's an example log output for a single request.

level=I time=2017-07-08T17:08:12UTC ip=193.92.20.19 method=GET path=/logs ua=Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36 status=200 params={}

Default log parameters

This is a complete list of the default parameters that are logged.

NameDescription
levelThe log output level. This will always be set to (I)nfo. There's really no need for any other log levels.
timeThe timestamp of the log entry. The date follows the ISO 8601 format (YYYY-MM-DDTHH:mm:ssZ)
ipThe request's IP. Takes into account the X-Forwarded-For header if it's set.
methodThe request method.
pathThe path for the request, leaving out the hostname part.
uaThe request's User-Agent header.
statusThe response status code.
paramsAny parameters that came with the request. The parameters will be logged in JSON format, even for non-JSON requests. The parameters are taken from either the request body or the query parameters (for GET requests).

Usage

Standalone

The logger needs a stream that implements the io.Writer interface. This is where all logging output will go.

type stream struct {}
func (s *stream) Write(p []byte) (n int, err error) {
// write somewhere
}
l := httplog.New(&stream{})
l.Log()

Middleware

If you're familiar with the http.Handler middleware pattern, you just need to provide your handler and a logger as arguments to the httplog.WithLogging function.

type customHandler {}
func (h *customHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(200)
// ...your handler logic goes here...
}
func main() {
// Configure a logger
l := httplog.New(os.Stdout)
// And use the middleware
http.Handle("/logs", httplog.WithLogging(&customHandler{}, l))
http.ListenAndServe(":8080", nil)
}

Performing a request to GET http://server.url:8080/logs?q=works will produce the following line in your server's standard output.

level=I time=2017-07-08T17:08:12UTC ip=193.92.20.19 method=GET path=/logs ua=Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36 status=200 params={"q": "works"}

Adding extra log parameters

Sometimes you might want to log some extra parameters, like information about the user making requests. You can use the logger's Add method and specify the parameter name and the value.

type User struct {
ID int
}
user := &User{ID: 1234}
l := httplog.New(os.Stdout)
l.Add("uid", user.ID)
l.Add("meta", "new-request")
l.Log()
// => level=I [...] uid=1234 meta=new-request

Contributing

Pull requests, bug fixes and issue reports are more than welcome! Please keep in mind that the goal is to keep the functionality minimal.

License

The package is released under the MIT License

About

Simple logger for HTTP requests https://godoc.org/github.com/gkats/httplog

Topics

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

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

7 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

gkats/httplog

Package httplog provides logging for http requests.

Apart from a ready to use logger that can be used freely, the package also provides a logging middleware (or wrapper) over http Handlers.

Install

$ go get github.com/gkats/httplog

Details

The functionality is purposely kept minimal. The logger outputs a small set of default parameters and provides an extensible way to log extra parameters if needed. The log format is a nice balance between human and machine readability.

The log output is one line per request. The parameters are separated with a blank space while the parameter key and its value are separated by the "=" character. Here's an example log output for a single request.

level=I time=2017-07-08T17:08:12UTC ip=193.92.20.19 method=GET path=/logs ua=Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36 status=200 params={}

Default log parameters

This is a complete list of the default parameters that are logged.

NameDescription
levelThe log output level. This will always be set to (I)nfo. There's really no need for any other log levels.
timeThe timestamp of the log entry. The date follows the ISO 8601 format (YYYY-MM-DDTHH:mm:ssZ)
ipThe request's IP. Takes into account the X-Forwarded-For header if it's set.
methodThe request method.
pathThe path for the request, leaving out the hostname part.
uaThe request's User-Agent header.
statusThe response status code.
paramsAny parameters that came with the request. The parameters will be logged in JSON format, even for non-JSON requests. The parameters are taken from either the request body or the query parameters (for GET requests).

Usage

Standalone

The logger needs a stream that implements the io.Writer interface. This is where all logging output will go.

type stream struct {}
func (s *stream) Write(p []byte) (n int, err error) {
// write somewhere
}
l := httplog.New(&stream{})
l.Log()

Middleware

If you're familiar with the http.Handler middleware pattern, you just need to provide your handler and a logger as arguments to the httplog.WithLogging function.

type customHandler {}
func (h *customHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(200)
// ...your handler logic goes here...
}
func main() {
// Configure a logger
l := httplog.New(os.Stdout)
// And use the middleware
http.Handle("/logs", httplog.WithLogging(&customHandler{}, l))
http.ListenAndServe(":8080", nil)
}

Performing a request to GET http://server.url:8080/logs?q=works will produce the following line in your server's standard output.

level=I time=2017-07-08T17:08:12UTC ip=193.92.20.19 method=GET path=/logs ua=Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36 status=200 params={"q": "works"}

Adding extra log parameters

Sometimes you might want to log some extra parameters, like information about the user making requests. You can use the logger's Add method and specify the parameter name and the value.

type User struct {
ID int
}
user := &User{ID: 1234}
l := httplog.New(os.Stdout)
l.Add("uid", user.ID)
l.Add("meta", "new-request")
l.Log()
// => level=I [...] uid=1234 meta=new-request

Contributing

Pull requests, bug fixes and issue reports are more than welcome! Please keep in mind that the goal is to keep the functionality minimal.

License

The package is released under the MIT License

About

Simple logger for HTTP requests https://godoc.org/github.com/gkats/httplog

Topics

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

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

7 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

gkats/httplog

Package httplog provides logging for http requests.

Apart from a ready to use logger that can be used freely, the package also provides a logging middleware (or wrapper) over http Handlers.

Install

$ go get github.com/gkats/httplog

Details

The functionality is purposely kept minimal. The logger outputs a small set of default parameters and provides an extensible way to log extra parameters if needed. The log format is a nice balance between human and machine readability.

The log output is one line per request. The parameters are separated with a blank space while the parameter key and its value are separated by the "=" character. Here's an example log output for a single request.

level=I time=2017-07-08T17:08:12UTC ip=193.92.20.19 method=GET path=/logs ua=Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36 status=200 params={}

Default log parameters

This is a complete list of the default parameters that are logged.

NameDescription
levelThe log output level. This will always be set to (I)nfo. There's really no need for any other log levels.
timeThe timestamp of the log entry. The date follows the ISO 8601 format (YYYY-MM-DDTHH:mm:ssZ)
ipThe request's IP. Takes into account the X-Forwarded-For header if it's set.
methodThe request method.
pathThe path for the request, leaving out the hostname part.
uaThe request's User-Agent header.
statusThe response status code.
paramsAny parameters that came with the request. The parameters will be logged in JSON format, even for non-JSON requests. The parameters are taken from either the request body or the query parameters (for GET requests).

Usage

Standalone

The logger needs a stream that implements the io.Writer interface. This is where all logging output will go.

type stream struct {}
func (s *stream) Write(p []byte) (n int, err error) {
// write somewhere
}
l := httplog.New(&stream{})
l.Log()

Middleware

If you're familiar with the http.Handler middleware pattern, you just need to provide your handler and a logger as arguments to the httplog.WithLogging function.

type customHandler {}
func (h *customHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(200)
// ...your handler logic goes here...
}
func main() {
// Configure a logger
l := httplog.New(os.Stdout)
// And use the middleware
http.Handle("/logs", httplog.WithLogging(&customHandler{}, l))
http.ListenAndServe(":8080", nil)
}

Performing a request to GET http://server.url:8080/logs?q=works will produce the following line in your server's standard output.

level=I time=2017-07-08T17:08:12UTC ip=193.92.20.19 method=GET path=/logs ua=Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36 status=200 params={"q": "works"}

Adding extra log parameters

Sometimes you might want to log some extra parameters, like information about the user making requests. You can use the logger's Add method and specify the parameter name and the value.

type User struct {
ID int
}
user := &User{ID: 1234}
l := httplog.New(os.Stdout)
l.Add("uid", user.ID)
l.Add("meta", "new-request")
l.Log()
// => level=I [...] uid=1234 meta=new-request

Contributing

Pull requests, bug fixes and issue reports are more than welcome! Please keep in mind that the goal is to keep the functionality minimal.

License

The package is released under the MIT License

About

Simple logger for HTTP requests https://godoc.org/github.com/gkats/httplog

Topics

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

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

7 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

gkats/httplog

Package httplog provides logging for http requests.

Apart from a ready to use logger that can be used freely, the package also provides a logging middleware (or wrapper) over http Handlers.

Install

$ go get github.com/gkats/httplog

Details

The functionality is purposely kept minimal. The logger outputs a small set of default parameters and provides an extensible way to log extra parameters if needed. The log format is a nice balance between human and machine readability.

The log output is one line per request. The parameters are separated with a blank space while the parameter key and its value are separated by the "=" character. Here's an example log output for a single request.

level=I time=2017-07-08T17:08:12UTC ip=193.92.20.19 method=GET path=/logs ua=Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36 status=200 params={}

Default log parameters

This is a complete list of the default parameters that are logged.

NameDescription
levelThe log output level. This will always be set to (I)nfo. There's really no need for any other log levels.
timeThe timestamp of the log entry. The date follows the ISO 8601 format (YYYY-MM-DDTHH:mm:ssZ)
ipThe request's IP. Takes into account the X-Forwarded-For header if it's set.
methodThe request method.
pathThe path for the request, leaving out the hostname part.
uaThe request's User-Agent header.
statusThe response status code.
paramsAny parameters that came with the request. The parameters will be logged in JSON format, even for non-JSON requests. The parameters are taken from either the request body or the query parameters (for GET requests).

Usage

Standalone

The logger needs a stream that implements the io.Writer interface. This is where all logging output will go.

type stream struct {}
func (s *stream) Write(p []byte) (n int, err error) {
// write somewhere
}
l := httplog.New(&stream{})
l.Log()

Middleware

If you're familiar with the http.Handler middleware pattern, you just need to provide your handler and a logger as arguments to the httplog.WithLogging function.

type customHandler {}
func (h *customHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(200)
// ...your handler logic goes here...
}
func main() {
// Configure a logger
l := httplog.New(os.Stdout)
// And use the middleware
http.Handle("/logs", httplog.WithLogging(&customHandler{}, l))
http.ListenAndServe(":8080", nil)
}

Performing a request to GET http://server.url:8080/logs?q=works will produce the following line in your server's standard output.

level=I time=2017-07-08T17:08:12UTC ip=193.92.20.19 method=GET path=/logs ua=Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36 status=200 params={"q": "works"}

Adding extra log parameters

Sometimes you might want to log some extra parameters, like information about the user making requests. You can use the logger's Add method and specify the parameter name and the value.

type User struct {
ID int
}
user := &User{ID: 1234}
l := httplog.New(os.Stdout)
l.Add("uid", user.ID)
l.Add("meta", "new-request")
l.Log()
// => level=I [...] uid=1234 meta=new-request

Contributing

Pull requests, bug fixes and issue reports are more than welcome! Please keep in mind that the goal is to keep the functionality minimal.

License

The package is released under the MIT License

About

Simple logger for HTTP requests https://godoc.org/github.com/gkats/httplog

Topics

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

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

7 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

gkats/httplog

Package httplog provides logging for http requests.

Apart from a ready to use logger that can be used freely, the package also provides a logging middleware (or wrapper) over http Handlers.

Install

$ go get github.com/gkats/httplog

Details

The functionality is purposely kept minimal. The logger outputs a small set of default parameters and provides an extensible way to log extra parameters if needed. The log format is a nice balance between human and machine readability.

The log output is one line per request. The parameters are separated with a blank space while the parameter key and its value are separated by the "=" character. Here's an example log output for a single request.

level=I time=2017-07-08T17:08:12UTC ip=193.92.20.19 method=GET path=/logs ua=Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36 status=200 params={}

Default log parameters

This is a complete list of the default parameters that are logged.

NameDescription
levelThe log output level. This will always be set to (I)nfo. There's really no need for any other log levels.
timeThe timestamp of the log entry. The date follows the ISO 8601 format (YYYY-MM-DDTHH:mm:ssZ)
ipThe request's IP. Takes into account the X-Forwarded-For header if it's set.
methodThe request method.
pathThe path for the request, leaving out the hostname part.
uaThe request's User-Agent header.
statusThe response status code.
paramsAny parameters that came with the request. The parameters will be logged in JSON format, even for non-JSON requests. The parameters are taken from either the request body or the query parameters (for GET requests).

Usage

Standalone

The logger needs a stream that implements the io.Writer interface. This is where all logging output will go.

type stream struct {}
func (s *stream) Write(p []byte) (n int, err error) {
// write somewhere
}
l := httplog.New(&stream{})
l.Log()

Middleware

If you're familiar with the http.Handler middleware pattern, you just need to provide your handler and a logger as arguments to the httplog.WithLogging function.

type customHandler {}
func (h *customHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(200)
// ...your handler logic goes here...
}
func main() {
// Configure a logger
l := httplog.New(os.Stdout)
// And use the middleware
http.Handle("/logs", httplog.WithLogging(&customHandler{}, l))
http.ListenAndServe(":8080", nil)
}

Performing a request to GET http://server.url:8080/logs?q=works will produce the following line in your server's standard output.

level=I time=2017-07-08T17:08:12UTC ip=193.92.20.19 method=GET path=/logs ua=Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36 status=200 params={"q": "works"}

Adding extra log parameters

Sometimes you might want to log some extra parameters, like information about the user making requests. You can use the logger's Add method and specify the parameter name and the value.

type User struct {
ID int
}
user := &User{ID: 1234}
l := httplog.New(os.Stdout)
l.Add("uid", user.ID)
l.Add("meta", "new-request")
l.Log()
// => level=I [...] uid=1234 meta=new-request

Contributing

Pull requests, bug fixes and issue reports are more than welcome! Please keep in mind that the goal is to keep the functionality minimal.

License

The package is released under the MIT License

About

Simple logger for HTTP requests https://godoc.org/github.com/gkats/httplog

Topics

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

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

7 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

gkats/httplog

Package httplog provides logging for http requests.

Apart from a ready to use logger that can be used freely, the package also provides a logging middleware (or wrapper) over http Handlers.

Install

$ go get github.com/gkats/httplog

Details

The functionality is purposely kept minimal. The logger outputs a small set of default parameters and provides an extensible way to log extra parameters if needed. The log format is a nice balance between human and machine readability.

The log output is one line per request. The parameters are separated with a blank space while the parameter key and its value are separated by the "=" character. Here's an example log output for a single request.

level=I time=2017-07-08T17:08:12UTC ip=193.92.20.19 method=GET path=/logs ua=Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36 status=200 params={}

Default log parameters

This is a complete list of the default parameters that are logged.

NameDescription
levelThe log output level. This will always be set to (I)nfo. There's really no need for any other log levels.
timeThe timestamp of the log entry. The date follows the ISO 8601 format (YYYY-MM-DDTHH:mm:ssZ)
ipThe request's IP. Takes into account the X-Forwarded-For header if it's set.
methodThe request method.
pathThe path for the request, leaving out the hostname part.
uaThe request's User-Agent header.
statusThe response status code.
paramsAny parameters that came with the request. The parameters will be logged in JSON format, even for non-JSON requests. The parameters are taken from either the request body or the query parameters (for GET requests).

Usage

Standalone

The logger needs a stream that implements the io.Writer interface. This is where all logging output will go.

type stream struct {}
func (s *stream) Write(p []byte) (n int, err error) {
// write somewhere
}
l := httplog.New(&stream{})
l.Log()

Middleware

If you're familiar with the http.Handler middleware pattern, you just need to provide your handler and a logger as arguments to the httplog.WithLogging function.

type customHandler {}
func (h *customHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(200)
// ...your handler logic goes here...
}
func main() {
// Configure a logger
l := httplog.New(os.Stdout)
// And use the middleware
http.Handle("/logs", httplog.WithLogging(&customHandler{}, l))
http.ListenAndServe(":8080", nil)
}

Performing a request to GET http://server.url:8080/logs?q=works will produce the following line in your server's standard output.

level=I time=2017-07-08T17:08:12UTC ip=193.92.20.19 method=GET path=/logs ua=Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36 status=200 params={"q": "works"}

Adding extra log parameters

Sometimes you might want to log some extra parameters, like information about the user making requests. You can use the logger's Add method and specify the parameter name and the value.

type User struct {
ID int
}
user := &User{ID: 1234}
l := httplog.New(os.Stdout)
l.Add("uid", user.ID)
l.Add("meta", "new-request")
l.Log()
// => level=I [...] uid=1234 meta=new-request

Contributing

Pull requests, bug fixes and issue reports are more than welcome! Please keep in mind that the goal is to keep the functionality minimal.

License

The package is released under the MIT License

About

Simple logger for HTTP requests https://godoc.org/github.com/gkats/httplog

Topics

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages