Comments (6)
Having the method called Logf
does make it incompatible with the standard logger, we could call the method Printf
(which makes it then incompatible with the testing
package... sounds like a design flaw), but we can work around with a trick like:
- converting a standard logger to an
analytics.Logger
type Logger interface {
// Compatible with the testing logger
Logf(string, ...interface{})
}
func StdLogger(logger *log.Logger) Logger {
return LoggerFunc(logger.Printf)
}
- converting a testing logger to an
analytics.Logger
type Logger interface {
// Compatible with the standard logger
Printf(string, ...interface{})
}
func TestingLogger(t *testing.T) Logger {
return LoggerFunc(t.Logf)
}
I'd say I like the first approach better so it doesn't create a dependency on the testing
package outside of test code.
from analytics-go.
What if we just accepted an io.Writer
?
from analytics-go.
I think having the concept of a logger is better, that way the program can set a specific log format (with timestamps in a special format or prefixed with "analytics" to make it easy to filter for example).
from analytics-go.
Cool makes sense - how about something that distinguishes b/w the log type.
type Logger interface {
Errorf(string, ...interface{})
Printf(string, ...interface{})
}
Or a bit more complex as we do in the java library (https://github.com/segmentio/analytics-java/blob/master/analytics/src/main/java/com/segment/analytics/Log.java#L5-L11).
This gives more power, and lets users format the message depending on the error level (e.g. red for errors if a tty is attached).
from analytics-go.
I'm down for a change of this kind but this interface is compatible with neither testing.T
nor log.Logger
.
If we change it to:
type Logger interface {
Logf(string, ...interface{})
Errorf(string, ...interface{})
}
It is then compatible with testing.T
and has the side effect of making the test fail if Errorf
is called (which may be cool, or may be weird if Errorf
isn't called if verbose is set to false for example).
I what we need the most is a compatibility shim to the standard logger but it only has Printf
, Panicf
or Fatalf
: https://golang.org/pkg/log/
We need to define what the mapping would be then, do we want something like this:
analytics | log |
---|---|
Logger.Logf | Logger.Printf |
Logger.Errorf | Logger.Fatalf |
or something like this (I like it better as it doesn't crash the program):
analytics | log |
---|---|
Logger.Logf | Logger.Printf("INFO: " + format, args...) |
Logger.Errorf | Logger.Printf("ERROR: " + format, args...) |
from analytics-go.
Yeah agreed, definitely prefer the latter in that case.
I think I'd prefer one of these 2 interfaces for the logger:
type Logger interface {
// Compatible with the standard logger
Printf(string, ...interface{})
}
// Provide adapter for test logger.
type Logger interface {
// No way to make this compatible with the standard logger without an adapter so lets just make it compatible with the test logger.
Logf(string, ...interface{})
Errorf(string, ...interface{})
}
// Provide adapter for standard logger.
from analytics-go.
Related Issues (20)
- The Version variable is out of date HOT 1
- Event tracking: passing a pointer to `Enqueue` results in silent dropped events HOT 1
- Need source field in Context struct to keep track of who sent the Identify or Track payload. HOT 1
- Any way to check if all messages sent before calling client.Close()? HOT 13
- Feature question - any go middleware? GIN specific middleware? HOT 2
- master is not current version HOT 4
- No error returned on empty or invalid write-key HOT 1
- Unclear if client.Close() actually sends the queued messages
- ScreenInfo.Density has wrong type
- Go mod incompatibility HOT 8
- Missing Context.Direct HOT 2
- update config to support custom http client or http.RoundTripper HOT 1
- Release new version?
- Response body not always fully read HOT 1
- Readme has malformed command
- v3.2.1 not loadable thru gopkg.in HOT 4
- Typo in Product struct? HOT 1
- Add context in Callback HOT 2
- Will this library work with Google AppEngine? HOT 1
- Timestamp with not enough precision
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from analytics-go.