golang log
自带log模块
写入文件
package main import (
"fmt"
"log"
"os"
) func main(){
logfile,err := os.OpenFile("d:/test.log",os.O_APPEND|os.O_RDWR|os.O_CREATE,);
if err!=nil {
fmt.Printf("%s\r\n",err.Error());
os.Exit(-);
}
defer logfile.Close();
logger := log.New(logfile,"\r\n",log.Ldate|log.Ltime|log.Llongfile);
logger.Println("hello");
logger.Println("oh....");
logger.Fatal("test");
logger.Fatal("test2");
}
写入文件同时输入到控制台
package main import (
"fmt"
"io"
"log"
"os"
) func main() {
logfile, err := os.OpenFile("d:/test.log", os.O_APPEND|os.O_RDWR|os.O_CREATE, )
if err != nil {
fmt.Printf("%s\r\n", err.Error())
os.Exit(-)
}
defer logfile.Close()
writers := []io.Writer{
logfile,
os.Stdout,
}
fileAndStdoutWriter := io.MultiWriter(writers...)
logger := log.New(fileAndStdoutWriter, "\r\n", log.Ldate|log.Ltime|log.Llongfile)
logger.Println("hello")
logger.Println("oh....")
logger.Fatal("test")
logger.Fatal("test2")
}
补充:
Ldate、Ltime等被定义为常量:
const (
// Bits or'ed together to control what's printed. There is no control over the
// order they appear (the order listed here) or the format they present (as
// described in the comments). A colon appears after these items:
// 2009/01/23 01:23:23.123123 /a/b/c/d.go:23: message
Ldate = 1 << iota // the date: 2009/01/23
Ltime // the time: 01:23:23
Lmicroseconds // microsecond resolution: 01:23:23.123123. assumes Ltime.
Llongfile // full file name and line number: /a/b/c/d.go:23
Lshortfile // final file name element and line number: d.go:23. overrides Llongfile
LstdFlags = Ldate | Ltime // initial values for the standard logger
)
log4go模块
/*
* [File]
* EmulateLoginBaidu.go
*
* [Function]
* 【记录】用go语言实现模拟登陆百度
* http://www.crifan.com/emulate_login_baidu_using_go_language/
*
* [Version]
* 2013-09-19
*
* [Contact]
* http://www.crifan.com/about/me/
*/
package main import (
//"fmt"
//"builtin"
//"log"
"os"
"runtime"
"path"
"strings"
//"io"
"time"
"io/ioutil"
"net/http"
//"net/http/cookiejar"
//"sync"
//"net/url"
) //import l4g "log4go.googlecode.com/hg"
//import l4g "code.google.com/p/log4go"
import "code.google.com/p/log4go" /***************************************************************************************************
Global Variables
***************************************************************************************************/
var gCurCookies []*http.Cookie;
//var gLogger *log.Logger;
var gLogger log4go.Logger; /***************************************************************************************************
Functions
***************************************************************************************************/
//do init before all others
func initAll(){
gCurCookies = nil
gLogger = nil initLogger()
initCrifanLib()
} //de-init for all
func deinitAll(){
gCurCookies = nil
if(nil == gLogger) {
gLogger.Close();
gLogger = nil
}
} //do some init for crifanLib
func initCrifanLib(){
gLogger.Debug("init for crifanLib")
gCurCookies = nil
return
} //init for logger
func initLogger(){
var filenameOnly string
filenameOnly = GetCurFilename()
var logFilename string = filenameOnly + ".log"; //gLogger = log4go.NewLogger()
gLogger = make(log4go.Logger)
//for console
//gLogger.AddFilter("stdout", log4go.INFO, log4go.NewConsoleLogWriter())
gLogger.AddFilter("stdout", log4go.INFO, log4go.NewConsoleLogWriter())
//for log file
if _, err := os.Stat(logFilename); err == nil {
//fmt.Printf("found old log file %s, now remove it\n", logFilename)
os.Remove(logFilename)
}
//gLogger.AddFilter("logfile", log4go.FINEST, log4go.NewFileLogWriter(logFilename, true))
gLogger.AddFilter("logfile", log4go.FINEST, log4go.NewFileLogWriter(logFilename, false))
gLogger.Info("Current time is : %s", time.Now().Format("15:04:05 MST 2006/01/02")) return
} // GetCurFilename
// Get current file name, without suffix
func GetCurFilename() string {
_, fulleFilename, _, _ := runtime.Caller()
//fmt.Println(fulleFilename)
var filenameWithSuffix string
filenameWithSuffix = path.Base(fulleFilename)
//fmt.Println("filenameWithSuffix=", filenameWithSuffix)
var fileSuffix string
fileSuffix = path.Ext(filenameWithSuffix)
//fmt.Println("fileSuffix=", fileSuffix) var filenameOnly string
filenameOnly = strings.TrimSuffix(filenameWithSuffix, fileSuffix)
//fmt.Println("filenameOnly=", filenameOnly) return filenameOnly
} //get url response html
func GetUrlRespHtml(url string) string{
gLogger.Debug("GetUrlRespHtml, url=%s", url)
var respHtml string = ""; resp, err := http.Get(url)
if err != nil {
gLogger.Warn("http get url=%s response errror=%s\n", url, err)
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
//gLogger.Debug("body=%s\n", body) gCurCookies = resp.Cookies() respHtml = string(body) return respHtml
} func printCurCookies() {
var cookieNum int = len(gCurCookies);
gLogger.Info("cookieNum=%d", cookieNum)
for i := ; i < cookieNum; i++ {
var curCk *http.Cookie = gCurCookies[i];
//gLogger.Info("curCk.Raw=%s", curCk.Raw)
gLogger.Info("------ Cookie [%d]------", i)
gLogger.Info("Name\t=%s", curCk.Name)
gLogger.Info("Value\t=%s", curCk.Value)
gLogger.Info("Path\t=%s", curCk.Path)
gLogger.Info("Domain\t=%s", curCk.Domain)
gLogger.Info("Expires\t=%s", curCk.Expires)
gLogger.Info("RawExpires=%s", curCk.RawExpires)
gLogger.Info("MaxAge\t=%d", curCk.MaxAge)
gLogger.Info("Secure\t=%t", curCk.Secure)
gLogger.Info("HttpOnly=%t", curCk.HttpOnly)
gLogger.Info("Raw\t=%s", curCk.Raw)
gLogger.Info("Unparsed=%s", curCk.Unparsed)
}
} func main() {
initAll() gLogger.Info("this is EmulateLoginBaidu.go") var baiduMainUrl string
baiduMainUrl = "http://www.baidu.com/";
//baiduMainUrl := "http://www.baidu.com/";
//var baiduMainUrl string = "http://www.baidu.com/";
gLogger.Info("baiduMainUrl=%s", baiduMainUrl)
respHtml := GetUrlRespHtml(baiduMainUrl)
gLogger.Debug("respHtml=%s", respHtml)
printCurCookies() deinitAll()
}
转自:http://www.crifan.com/go_language_output_log_to_both_file_and_console_meantime_via_log4go/
golang log的更多相关文章
- golang log 使用
原文:https://www.jianshu.com/p/d634316a9487 --------------------------------------------- 在我们开发程序后,如果有 ...
- 支持rotate和大小限制的golang log库
支持大小限制和rotate的log库,还是很有必要的,前者让你不再操心磁盘被吃光,后者让查日志更方便. 但是在golang中没有太好的实现,看过一些开源的和自行实现的,都有几个不满意的地方,比如: 没 ...
- golang log日志
写入日志文件 func main() { file, err := os.Create("test.log") if err != nil { log.Fatalln(" ...
- golang——log包学习
log包实现了简单的日志服务. 1.func New(out io.Writer, prefix string, flag int) *Logger New创建一个Logger. 参数out设置日志信 ...
- golang之log rotate
操作系统: CentOS 6.9_x64 go语言版本: 1.8.3 问题描述 golang的log模块提供的有写日志功能,示例代码如下: /* golang log example E-Mail : ...
- Golang 标准库提供的Log(一)
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://gotaly.blog.51cto.com/8861157/1405754 G ...
- Golang 异常/日志处理
1.xerrors 异常 xerrors 包是一个非常棒的设计,不同于往常语言如java/php,因为go的errors只是一个string类型的映射,所以内存占用空间很少.这在golang的核心库和 ...
- golang日志框架--logrus学习笔记
golang日志框架--logrus学习笔记 golang标准库的日志框架非常简单,仅仅提供了print,panic和fatal三个函数,对于更精细的日志级别.日志文件分割以及日志分发等方面并没有提供 ...
- Awesome Go
A curated list of awesome Go frameworks, libraries and software. Inspired by awesome-python. Contrib ...
随机推荐
- 二分图最大权值匹配 KM算法 模板
KM算法详解+模板 大佬讲的太好了!!!太好了!!! 转载自:http://www.cnblogs.com/wenruo/p/5264235.html KM算法用来求二分图最大权完美匹配. 本文配合该 ...
- win10的host设置
路径:C:\Windows\System32\drivers\etc\hosts 例如: 127.0.0.1 localhost 10.201.3.177 apmdbm1
- MFC通过URL下载并保存文件代码 转载
http://blog.csdn.net/charlessimonyi/article/details/8666108?utm_source=tuicool&utm_medium=referr ...
- ES6笔记01
一.ECMAScript 6 ECMAScript 6.0,简称ES6,第一个版本是在2015年6月进行发布,所以也称之为<ECMAScript 2015 标准>(简称 ES2015). ...
- CSS&JS定位器
一.CssSelector定位器 1.概述 CssSelector是效率很高的元素定位方法,Selenium官网的Document里极力推荐使用CSS locator,而不是XPath来定位元素,原因 ...
- c# 动态编译继承接口
c#里面的动态编译我就不讲了,主要的都有了.如果不熟悉我推荐博文 https://www.cnblogs.com/maguoyong/articles/5553827.html 标准的动态编译 这里主 ...
- Reverse a String-freecodecamp算法题目
Reverse a String(翻转字符串) 题目要求: 把字符串转化成数组 借助数组的reverse方法翻转数组顺序 把数组转化成字符串 思路: 用.split('')将字符串转换成单个字母组成的 ...
- windows 开启 nginx 监听80 端口 以及 禁用 http 服务后,无法重启 HTTP 服务,提示 系统错误 123,文件目录、卷标出错
1. 正常情况直接运行 start nginx.exe 不能开启成功,因为 80 端口被占用.提示: bind() to 0.0.0.0:80 failed (10013: An attempt w ...
- CentOS7——网络配置
ip addr #查看当前IP地址信息.(contos7以下的为ifconfig) /etc/sysconfig/network-scripts/ifcfg-*** #***代表不一定的,需要进入该设 ...
- 转:java23种设计模式
以下是学习过程中查询的资料,别人总结的资料,比较容易理解(站在各位巨人的肩膀上,望博主勿究) 概述 设计模式是针对某一类问题的最优解决方案,是从许多优秀的软件系统中总结出的. Java中设计模式(ja ...