x-cray / logrus-prefixed-formatter Goto Github PK
View Code? Open in Web Editor NEWLogrus Prefixed Log Formatter
License: MIT License
Logrus Prefixed Log Formatter
License: MIT License
Since there was a breaking change in logrus, can you please provide two tags? One before the change of #4 which points out that logrus <= 0.11.0 is supported and one that says that it is compatible with logrus >= 0.11.1 ? That would make live way easier for people like me, that are using tools like glide, because i do not have to search for commit hashes then ;)
Thanks
logrus implement CallerPrettyfier in TextFormatter and JsonFormatter
could you support this?
In logrus.TextFormatter
, the msg
field is always the third field (after time and level).
This makes sense because the other tags are probably additional information about the error, compare:
time="2017-06-28T13:37:18+02:00" level=fatal msg="Can't open file" filename="/usr/local/share/man"
vs
time="2017-06-28T13:37:18+02:00" level=fatal filename="/usr/local/share/man" msg="Can't open file"
In prefixed.TextFormatter
it is always at the end, which in my opinion makes the log more difficult to read.
This happened a few times in a server under intense load (with lots of goroutines).
fatal error: concurrent map read and map write
time="2018-01-17T22:40:01.546780408Z" level=info msg="sending slack message" prefix="tools/prober" source="main.sendSlackMessage([...]/tools/prober/slack.go:124)"
goroutine 276445 [running]:
runtime.throw(0xb28baa, 0x21)
/usr/lib/google-golang/src/runtime/panic.go:608 +0x9e fp=0xc4340ab5b8 sp=0xc4340ab598 pc=0x542cce
runtime.mapaccess1_faststr(0xa5e5c0, 0xc4201d1350, 0xb1659c, 0x6, 0xa1d0e0)
/usr/lib/google-golang/src/runtime/hashmap_fast.go:217 +0x43a fp=0xc4340ab610 sp=0xc4340ab5b8 pc=0x522f7a
[...]/vendor/github.com/x-cray/logrus-prefixed-formatter.(*TextFormatter).Format(0xc420080aa0, 0xc42c929cc0, 0xc42014a400, 0xafeb60, 0xc421e280e0, 0x0, 0xc42def1740)
/[...]/vendor/github.com/x-cray/logrus-prefixed-formatter/formatter.go:216 +0x4a3 fp=0xc4340ab7a0 sp=0xc4340ab610 pc=0x939a83
[...]/vendor/github.com/sirupsen/logrus.Entry.log(0xc420080460, 0xc4201d1350, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc400000004, ...)
/[...]/vendor/github.com/sirupsen/logrus/entry.go:109 +0x22c fp=0xc4340ab870 sp=0xc4340ab7a0 pc=0x902c4c
[...]/vendor/github.com/sirupsen/logrus.(*Entry).Info(0xc4201d2730, 0xc4340ab948, 0x1, 0x1)
/[...]/vendor/github.com/sirupsen/logrus/entry.go:144 +0xac fp=0xc4340ab8e0 sp=0xc4340ab870 pc=0x90322c
main.sendSlackMessage(0xc428cd56b0, 0xc, 0xb2192a)
/[...]/tools/prober/slack.go:124 +0x7d fp=0xc4340ab968 sp=0xc4340ab8e0 pc=0x9afe8d
main.(*environment).slackAlerts(0xc420199490)
/[...]/tools/prober/slack.go:70 +0x4e3 fp=0xc4340abaf0 sp=0xc4340ab968 pc=0x9af333
main.(*environment).check(0xc420199490)
/[...]/tools/prober/prober.go:325 +0x13fb fp=0xc4340abfa0 sp=0xc4340abaf0 pc=0x9ae45b
main.(*environment).start.func1(0xc4201ee410, 0xc420199490)
/[...]/tools/prober/prober.go:344 +0x5a fp=0xc4340abfd0 sp=0xc4340abfa0 pc=0x9b030a
runtime.goexit()
/usr/lib/google-golang/src/runtime/asm_amd64.s:2337 +0x1 fp=0xc4340abfd8 sp=0xc4340abfd0 pc=0x5735d1
created by main.(*environment).start
/[...]/tools/prober/prober.go:342 +0x9f
Hi,
I've created this question in stack overflow.
https://stackoverflow.com/questions/48971780/go-change-format-of-log-output-logrus
what I need is formatting like
[INFO]:2018-02-25 10:42:20 - Starting Process
There is a simple way to do it with your lib ?
I use go logrus and I need to change the format of the output message, I try several of things without success
what I need is format like this with formatter of logrus
[error]: datetime - message
What I've tried without success is this
logger := &logrus.Logger{
Out: os.Stderr,
Level: level,
Formatter: &logrus.TextFormatter{
DisableColors: true,
TimestampFormat : "2006-01-02 15:04:05",
FullTimestamp:true,
},
}
This produce the following
time="2018-02-25 10:42:20" level=error msg="Starting Process"
And I want it to be
[INFO]:2018-02-25 10:42:20 - Starting Process
Hi,
It used to work because I referenced it in another issue #9 (which was not one).
But it does not work anymore:
time="2017-06-12T17:36:43+02:00" level=error msg="Command failed" ... Msg="raidcom: [EX_CMDRJE] An order to the control/command device was rejected
It was rejected due to SKEY=0x05, ASC=0x26, ASCQ=0x00, SSB=0xB958,0x0233 on Serial#(358702)
CAUSE : It cannot be deleted because the operation object LU is executing host I/O.
" Nature=Locked RequestID=2eebe597-e33a-55be-bd78-35d7ef6db86f Status=221 Subcommand=delete ....
I noticed that you use %v method for quoting, but as shown here that does not work as intended.
You may use fmt.Fprintf(b, "%q", value) instead but you'll need to strip the first and final character to remove the quotes.
Do you want me to do a pull request of any kind?
Is therere any possibility to log file and line like
Info = log.New(infoHandle,
"INFO: ",
log.Ldate|log.Ltime|log.Lshortfile)
In standard package log ?
Hi,
First ever issue, forgive any noobness please.
Logrus has made breaking changes (without bumping semantic version!). The logrus.IsTerminal()
function has been removed and this breaks prefixed-formatter.
The logrus change can be seen here and go get
fails for logrus-prefixed-formatter:
go get -u github.com/x-cray/logrus-prefixed-formatter
# github.com/x-cray/logrus-prefixed-formatter
../../../../../github.com/x-cray/logrus-prefixed-formatter/formatter.go:147: undefined: logrus.IsTerminal
The problem for prefixed-formatter is in formatter.go:147
A quick solution is to change formatter.go:147
to
f.isTerminal = f.checkIfTerminal(entry.Logger.Out)
and copy the private function checkIfTerminal()
from logrus text_formatter.go:72
into formatter.go
.
func (f *TextFormatter) checkIfTerminal(w io.Writer) bool {
switch v := w.(type) {
case *os.File:
return terminal.IsTerminal(int(v.Fd()))
default:
return false
}
}
This introduces a dependency on golang.org/x/crypto/ssh/terminal
With these changes the test suite runs correctly as do my applications. I don't know enough about the guts of logrus and terminals to put a 100% guarantee on the soundness of this solution.
If there's anything else I can do, let me know.
Love the library. I may implement the colorized output formatter with the colors disabled without a tty for a project of mine . Is this a feature you have considered or planned?
Hi,
I recently updated the dependencies of a project and got this error: .go/src/github.com/x-cray/logrus-prefixed-formatter/formatter.go:178: undefined: logrus.DefaultTimestampFormat
I believe it has to do with this commit.
Just a heads up!
Thanks!
I'm using this formatter in conjunction with https://github.com/rifflock/lfshook to save the log to a file, like this:
logger.Hooks.Add(lfshook.NewHook( LOG_FILE_PATH, &prefixed.TextFormatter{ FullTimestamp: true, TimestampFormat: "2006-01-02T15:04:05.999Z", DisableColors: runtime.GOOS == "windows", }, ))
However, when writing to the file the next log entry is appended on the same line.
Is there an option in the formatter to write it on a newline, like happens in the terminal?
EDIT: My bad, seems to be fine in a more advanced editor than Notepad
Hi!
I really like what your project.
Could you put the colours your format use in some struct/fields ?
On my terminal, with solarized colour scheme, I can't see the timestamp or the message...
Maybe putting the colours in a struct, allow the user to create easily colour themes...
�[90m[0000]�[0m �[34mDEBUG�[0m�[36m main:�[0m Started observing beach �[34manimal�[0m=walrus �[34mnumber�[0m=8
�[90m[0000]�[0m �[32m INFO�[0m�[36m sensor:�[0m Temperature changes �[32mtemperature�[0m=-4
QuoteEmptyFields
does not quote empty fields even when set to true
explicitly. The following code
package main
import (
"time"
"github.com/sirupsen/logrus"
prefixed "github.com/x-cray/logrus-prefixed-formatter"
)
func init() {
logrus.SetFormatter(&prefixed.TextFormatter{
TimestampFormat: time.RFC3339,
FullTimestamp: true,
ForceFormatting: true,
QuoteEmptyFields: true,
})
logrus.SetLevel(logrus.DebugLevel)
}
func main() {
logrus.WithFields(logrus.Fields{
"prefix": "main",
"emptyfield1": "",
"emptyfield2": "",
"number": 0,
}).Debug("Started observing beach")
}
outputs
[2023-01-28T18:32:38+05:00] DEBUG main: Started observing beach emptyfield1= emptyfield2= number=0
Notice the empty fields are not quoted. Am I missing something here?
I've wrapped the standard os.Stdout
/os.Stderr
io.Writer options, and also use io.MultiWriter
for potentially multiple output targets. I do this because I have a layer of text processing to take place before output hits the terminal. With the latest updates to this library (and logrus
) logging is now downgraded because io.Writer
is not an *os.File
but instead my custom wrapping type. Perhaps this is really an issue with logrus
but it seems like it would be nice to force terminal status.
Please release a new version with the latest bugfix: 31b3412
Currently we need to stick the version to the current master in glide.
Hi!
I have a multiline input to log (the content of a short file), and without your formatter,
it is written as I expect to.
But your formatter escapes the new line (\n) if I don't use colors.
It is the needsQuote part that does that I think...
Can you do anything for me?
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.