From d32bfc962c3e0df796cbabe02876b61f13aa17c5 Mon Sep 17 00:00:00 2001 From: Rob Napier Date: Wed, 23 Apr 2014 14:21:11 -0400 Subject: [PATCH] Add Windows/FreeBSD support --- terminal_darwin.go | 12 ++++++++++++ terminal_freebsd.go | 20 ++++++++++++++++++++ terminal_linux.go | 12 ++++++++++++ terminal_notwindows.go | 21 +++++++++++++++++++++ terminal_windows.go | 26 ++++++++++++++++++++++++++ text_formatter.go | 5 +---- 6 files changed, 92 insertions(+), 4 deletions(-) create mode 100644 terminal_darwin.go create mode 100644 terminal_freebsd.go create mode 100644 terminal_linux.go create mode 100644 terminal_notwindows.go create mode 100644 terminal_windows.go diff --git a/terminal_darwin.go b/terminal_darwin.go new file mode 100644 index 0000000..8fe02a4 --- /dev/null +++ b/terminal_darwin.go @@ -0,0 +1,12 @@ +// Based on ssh/terminal: +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package logrus + +import "syscall" + +const ioctlReadTermios = syscall.TIOCGETA + +type Termios syscall.Termios diff --git a/terminal_freebsd.go b/terminal_freebsd.go new file mode 100644 index 0000000..0428ee5 --- /dev/null +++ b/terminal_freebsd.go @@ -0,0 +1,20 @@ +/* + Go 1.2 doesn't include Termios for FreeBSD. This should be added in 1.3 and this could be merged with terminal_darwin. +*/ +package logrus + +import ( + "syscall" +) + +const ioctlReadTermios = syscall.TIOCGETA + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Cc [20]uint8 + Ispeed uint32 + Ospeed uint32 +} diff --git a/terminal_linux.go b/terminal_linux.go new file mode 100644 index 0000000..a2c0b40 --- /dev/null +++ b/terminal_linux.go @@ -0,0 +1,12 @@ +// Based on ssh/terminal: +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package logrus + +import "syscall" + +const ioctlReadTermios = syscall.TCGETS + +type Termios syscall.Termios diff --git a/terminal_notwindows.go b/terminal_notwindows.go new file mode 100644 index 0000000..276447b --- /dev/null +++ b/terminal_notwindows.go @@ -0,0 +1,21 @@ +// Based on ssh/terminal: +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build linux,!appengine darwin freebsd + +package logrus + +import ( + "syscall" + "unsafe" +) + +// IsTerminal returns true if the given file descriptor is a terminal. +func IsTerminal() bool { + fd := syscall.Stdout + var termios Termios + _, _, err := syscall.Syscall6(syscall.SYS_IOCTL, uintptr(fd), ioctlReadTermios, uintptr(unsafe.Pointer(&termios)), 0, 0, 0) + return err == 0 +} diff --git a/terminal_windows.go b/terminal_windows.go new file mode 100644 index 0000000..fe71be4 --- /dev/null +++ b/terminal_windows.go @@ -0,0 +1,26 @@ +// Based on ssh/terminal: +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build windows + +package logrus + +import ( + "syscall" + "unsafe" +) +var kernel32 = syscall.NewLazyDLL("kernel32.dll") + +var ( + procGetConsoleMode = kernel32.NewProc("GetConsoleMode") +) + +// IsTerminal returns true if the given file descriptor is a terminal. +func IsTerminal() bool { + fd := syscall.Stdout + var st uint32 + r, _, e := syscall.Syscall(procGetConsoleMode.Addr(), 2, uintptr(fd), uintptr(unsafe.Pointer(&st)), 0) + return r != 0 && e == 0 +} diff --git a/text_formatter.go b/text_formatter.go index ad21821..b787c66 100644 --- a/text_formatter.go +++ b/text_formatter.go @@ -2,11 +2,8 @@ package logrus import ( "fmt" - "os" "sort" "strings" - - "github.com/burke/ttyutils" ) const ( @@ -25,7 +22,7 @@ type TextFormatter struct { func (f *TextFormatter) Format(entry *Entry) ([]byte, error) { var serialized []byte - if f.ForceColors || ttyutils.IsTerminal(os.Stdout.Fd()) { + if f.ForceColors || IsTerminal() { levelText := strings.ToUpper(entry.Data["level"].(string))[0:4] levelColor := blue